Sockets
André Restivo
with minor tweaks by Carlos Soares
Faculdade de Engenharia da Universidade do Porto
March 27, 2014
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
1 / 28
Sumário
1
Introdução
2
Cliente/Servidor
3
API C++
4
Exemplo
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
2 / 28
Introdução
Outline
1
Introdução
2
Cliente/Servidor
3
API C++
4
Exemplo
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
3 / 28
Introdução
Comunicação entre Processos e Sockets
Processos precisam de comunicar entre si
I
ex. programa em C++ que acede a base de dados
... na mesma máquina ou em máquinas diferentes
Sockets
I
I
protocolo de ligações entre processos
independente
F
ex. entre computadores diferentes e S.O. diferentes
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
4 / 28
Introdução
Tipos de Sockets
Conexão
I
I
conexão estabelecida antes da comunicação
cada mensagem indica o seu destino
Tamanho da mensagem
I
I
pacotes: tamanho fixo
streams: fluxo contínuo de dados
Garantia de entrega
I
mensagens podem ser perdidas, duplicadas, reordenadas ou
corrompidas?
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
5 / 28
Introdução
Arquiteturas de Aplicações em Rede
Fonte: http://www.freesoftwaremagazine.com/articles/information_technology_and_piracy
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
6 / 28
Introdução
Comunicação entre Processos com Sockets
Com conexão
Sem conexão
Fonte: http://www.cse.iitk.ac.in/users/dheeraj/cs425/lec19.html
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
7 / 28
Introdução
Características dos Sockets
Domínio:
I
I
AF_UNIX: UNIX pathname
AF_INET: host and port number
Tipo:
I
I
circuito virtual: dados recebidos pelo ordem correta e com garantia de
entrega
datagrama: ordem aleatória e sem garantia de entrega
Protocolo:
I
I
TCP/IP: circuitos virtuais (com conexão)
UDP: datagramas (sem conexão)
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
8 / 28
Cliente/Servidor
Outline
1
Introdução
2
Cliente/Servidor
3
API C++
4
Exemplo
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
9 / 28
Cliente/Servidor
Arquitetura Cliente-Servidor
Servidor
socket: create the
socket
bind: give the address
of the socket on the
server
listen: specifies the
maximum number of
connection requests
that can be pending for
this process
Cliente:
socket: create the
socket
connect: connect to a
server
accept: establish the
connection with a
specific client
send,recv: (repeated)
shutdown
send,recv:
stream-based
equivalents of read and
write (repeated)
close
shutdown: end reading
or writing
close: release kernel
data structures
Fonte: http://www.cse.iitk.ac.in/
users/dheeraj/cs425/lec19.html
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
10 / 28
Cliente/Servidor
Arquitetura Cliente-Servidor: Outra Perspetiva
Fonte: http://www.infres.enst.fr/~domas/TPsockCJava.html
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
11 / 28
Cliente/Servidor
Tipos de Servidor
Servidor iterativo
I
I
Apenas um socket é
aberto de cada vez.
Quando uma ligação
termina, o socket é
fechado e podemos
aceitar outra ligação.
Servidor multi-processo
I
I
Depois de um accept
é criado um novo
process/thread filho
para tratar da ligação.
Em alguns casos os
processos filho são
criados mesmo antes
das ligações serem
aceites.
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
12 / 28
API C++
Outline
1
Introdução
2
Cliente/Servidor
3
API C++
4
Exemplo
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
13 / 28
API C++
socket
Exemplo
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / s o c k e t . h>
i n t s o c k e t ( i n t domain , i n t t y p e , i n t p r o t o c o l ) ;
Retorna um descritor de ficheiro (file descriptor) ou -1 se falhar
O domínio é normalmente AF_INET.
type pode ser:
SOCK STREAM: Circuito virtual
SOCK DGRAM: Datagrama
protocol é normalmente 0.
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
14 / 28
API C++
bind
Exemplo
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / s o c k e t . h>
i n t b i n d ( i n t s o c k f d , s t r u c t s o c k a d d r ∗my_addr , i n t a d d r l e n ) ;
sid: é o socket id (file descriptor devolvido bind).
addrPtr: um apontador para a estrutura do endereço (depende do
tipo de ligação).
len: o tamanho de *addrPtr
Associa um socket id com um endereço de forma a que outros processos se
possam ligar. No caso de usarmos IP (internet protocol) o endereço é da
forma endereço IP + porta.
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
15 / 28
API C++
connect
Exemplo
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / s o c k e t . h>
i n t connect ( i n t sockfd , struct sockaddr ∗ serv_addr , i n t addrlen )
Especifica o endereço (addrPtr) ao qual o cliente se quer ligar. Retorna 0
se tiver sucesso ou -1 se falhar.
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
16 / 28
API C++
listen
Exemplo
int l i s t e n ( int sockfd , int backlog ) ;
size: número de ligações que podem ficar pendentes. Normalmente no
máximo 5.
Retorna 0 se tiver sucesso ou -1 se falhar.
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
17 / 28
API C++
accept
Exemplo
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / s o c k e t . h>
i n t a c c e p t ( i n t s o c k f d , s t r u c t s o c k a d d r ∗ addr , s o c k l e n _ t ∗ a d d r l e n
Retorna o socket id e endereço do cliente que se ligou ao socket.
lenPtr: máximo tamanho da estrutura do endereço. Retorna o valor real.
Espera por uma ligação, e quando esta chega cria um socket para ela.
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
18 / 28
API C++
send
Exemplo
i n t s e n d ( i n t s o c k f d , c o n s t v o i d ∗msg , i n t l e n , i n t f l a g s ) ;
Envia uma mensagem. Retorna o número de bytes enviados ou -1 em caso
de erro.
flag normalmente = 0
Com a flag a 0 é o mesmo que:
Exemplo
i n t w r i t e ( i n t s o c k f d , c o n s t v o i d ∗msg , i n t l e n ) ; // f l a g s = 0
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
19 / 28
API C++
recv
Exemplo
i n t r e c v ( i n t s o c k f d , v o i d ∗ buf , i n t l e n , i n t f l a g s ) ;
Recebe até, no máximo, len bytes no bufferPtr. Retorna o número de
bytes recebidos ou -1 no caso de falhar.
flag normalmente = 0
Com a flag a 0 é o mesmo que:
Exemplo
i n t r e a d ( i n t s o c k f d , v o i d ∗ buf , i n t l e n ) ;
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
20 / 28
API C++
close / shutdown
Exemplo
close ( sockfd );
i n t shutdown ( i n t s o c k f d , i n t how ) ;
how pode ser:
0 Deixa de receber dados
1 Deixa de enviar dados
2 Deixa de enviar e receber dados
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
21 / 28
Exemplo
Outline
1
Introdução
2
Cliente/Servidor
3
API C++
4
Exemplo
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
22 / 28
Exemplo
Inicializar Socket
Exemplo
s o c k f d = s o c k e t ( AF_INET , SOCK_STREAM, 0 ) ;
i f ( s o c k f d < 0) {
c o u t << " E r r o r ␣ c r e a t i n g ␣ s o c k e t " << e n d l ;
e x i t ( −1);
}
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
23 / 28
Exemplo
Criar Estrutura do Endereço
Exemplo
b z e r o ( ( c h a r ∗ ) &s e r v _ a d d r , s i z e o f ( s e r v _ a d d r ) ) ;
s e r v _ a d d r . s i n _ f a m i l y = AF_INET ;
s e r v _ a d d r . s i n _ a d d r . s _ a d d r = INADDR_ANY ;
serv_addr . sin_port = htons ( port ) ;
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
24 / 28
Exemplo
Fazer Bind ao Socket
Exemplo
i n t r e s = b i n d ( s o c k f d , ( s t r u c t s o c k a d d r ∗) &s e r v _ a d d r , s i z e o f ( s e r v _ a d d r ) ) ;
i f ( r e s < 0) {
c o u t << " E r r o r ␣ b i n d i n g ␣ t o ␣ s o c k e t " << e n d l ;
e x i t ( −1);
}
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
25 / 28
Exemplo
Ficar à espera de ligações
Exemplo
l i s t e n ( sockfd , 5 ) ;
client_addr_length = sizeof ( cli_addr );
n e w s o c k f d = a c c e p t ( s o c k f d , ( s t r u c t s o c k a d d r ∗) &c l i _ a d d r , &c l i e n t _ a d d r _ l e n g t h ) ;
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
26 / 28
Exemplo
Comunicar
Exemplo
bzero ( buffer , 256);
while ( i n t n = r e c v ( newsockfd , b u f f e r , 255 , 0) > 0) {
c o u t << " R e c e i v e d ␣ message : ␣ " << b u f f e r << e n d l ;
n = s e n d ( n e w s o c k f d , " I ␣ g o t ␣ y o u r ␣ message \n " , 1 9 , 0 ) ;
bzero ( buffer , 256);
}
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
27 / 28
Exemplo
Fechar os Sockets
Exemplo
c l o s e ( newsockfd ) ;
close ( sockfd );
André Restivo with minor tweaks by Carlos Soares (FEUP)
Sockets
March 27, 2014
28 / 28
Download

Sockets - Faculdade de Engenharia da Universidade do Porto