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