A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Desenvolvimento de Aplicações TCP/IP com Sockets Márcio de Sousa Dias

Apresentações semelhantes


Apresentação em tema: "Desenvolvimento de Aplicações TCP/IP com Sockets Márcio de Sousa Dias"— Transcrição da apresentação:

1 Desenvolvimento de Aplicações TCP/IP com Sockets Márcio de Sousa Dias marciosd@nce.ufrj.br

2 Sumário  Introdução  Arquitetura Internet TCP/IP  Endereçamento Internet  Modelo Cliente-Servidor  Interface de Sockets  Arquiteturas Cliente-Servidor  Protocolo de Serviços Internet

3 Arquitetura Internet TCP/IP  Internet Protocol (IP): Datagrama não confiável  Transmission Control Protocol (TCP): Conexão  User Data Protocol (UDP): Datagrama não confiável

4 Endereçamento Internet  Endereço IP : 32 bits (4 octetos)  exemplo: 146.164.10.2  duas partes: Id. da rede + Id. do host  Classes de endereçamento:  Classe A: 1 octeto para Rede (16 milhões de hosts) 1.x.x.x a 126.x.x.x  Classe B: 2 octetos para Rede (65 mil hosts) 128.1.x.x a 191.254.x.x  Classe C: 3 octetos para Rede (254 hosts) 192.1.1.x a 223.254.254.x  Sistema de domínios e servidores de nomes:  Organização hierárquica  Nomes: br ufrj.br nce.ufrj.br ipanema.nce.ufrj.br

5 Modelo Cliente-Servidor TCP/IP  Comunicação ponto a ponto  Paradigma de Comunicação Cliente/Servidor  Servidores baseados em conexão/datagrama:  TCP garante confiabilidade (overhead e delays)  UDP depende do Ambiente. Só usado quando: o protocolo da aplicação controla confiabilidade; confia no broadcast ou multicast do hardware; ou a aplicação não pode tolerar o atraso computacional exigido nos circuitos virtuais do TCP.  Servidores com/sem estado  Com estado: mensagens menores, processamento simples; protocolo mais complexo para controlar estados e erros  Sem estado: protocolo deve realizar operações idempotentes

6 A Interface de Sockets  Objetivo:  Funções para comunicação com múltiplos protocolos  TCP/IP é uma família de protocolo nesse contexto  Especificar tipo de serviço, e não o nome do protocolo  Usando um socket:  Esperar pedido de conexão: socket passivo  Iniciar uma conexão: socket ativo

7 Usando Sockets

8 Principais Funções de Sockets #include Estrutura de Dados para Endereço do Socket /* Structure used by kernel to store most addresses. */ struct sockaddr { u_short sa_family; /* address family */ char sa_data[14]; /* up to 14 bytes of direct address */ }; /* Socket address, internet style. */ struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };

9 Principais Funções de Socket socket: Cria um novo socket para comunicação em rede. int socket (int af, int type, int proto); connect: Após criação do socket, um cliente chama connect para estabelecer uma conexão ativa com um servidor remoto. int connect (int s, const struct sockaddr *addr, int addrlen); bind: Quando um socket é criado, ele não possui noção dos endereços (local e remoto). Uma aplicação chama bind para especificar o endereço local da porta. Um servidor chama bind para especificar a porta pela qual aceitará conexões. int bind (int s, const struct sockaddr *addr, int addrlen); listen: Quando um socket é criado, ele não é ativo nem passivo. Servidor orientados a conexão chamam listen para colocar o socket em modo passivo e para torná-lo apto a aceitar conexões. int listen (int s, int qlen); accept: O servidor chama accept para aceitar a próxima requisição de conexão. Ela cria um novo socket para cada conexão requisitada. O socket original continua sendo usado para aceitar novas conexões, enquanto o novo socket é utilizado efetivamente para comunicação com o cliente. int accept (int s, struct sockaddr *addr, int *addrlen);

10 Escondendo Detalhes

11 Aplicações Clientes  Exemplo de Cliente TCP: daytime #include #include “connect.h” int main () { char buffer[200]; int n, s; s = connectTCP( “barra.nce.ufrj.br”, “daytime” ); while( (n = read( s, buffer, sizeof(buffer) )) > 0 ) { buffer[n] = ‘\0’; puts( buffer ); } close(s); exit(0); }

12 Aplicações Clientes  Exemplo de Cliente TCP: echo #include #include “connect.h” int main () { char buffer[200]; int n, s; s = connectTCP( “barra.nce.ufrj.br”, “echo” ); while( strlen( gets(buffer) ) ) { write( s, buffer, strlen(buffer) ); while( (n = read( s, buffer, sizeof(buffer) )) > 0 ) { buffer[n] = ‘\0’; printf( buffer ); } close(s); exit(0); }

13 Aplicações Clientes  TCP/UDP ‘conectado’ Quando aplicado a sockets de tipo SOCK_DGRAM, a função connect apenas armazena o endereço para posterior uso.  UDP não ‘conectado’

14 Revelando os Detalhes (1)  Identificar Localização do Servidor: host + porta  Identificando Host: Converter endereço IP para 32 bits struct hostent { char * h_name;/* official name of host */ char ** h_aliases;/* alias list */ short h_addrtype;/* host address type */ short h_length;/* length of address */ char ** h_addr_list;/* list of addresses */ #define h_addr h_addr_list[0] }; #include struct hostent * phe; char *hostname = “barra.nce.ufrj.br”; /* ou “146.164.8.7” */ if( phe = gethostbyname(hostname) ) { /* Endereço IP 32 bits: phe->h_addr */ } else { /* Erro: nome do host não encontrado */ }

15 Revelando os Detalhes (2)  Identificando Porta de Serviços Conhecidos: struct servent { char * s_name;/* official service name */ char ** s_aliases;/* alias list */ short s_port;/* port # */ char * s_proto;/* protocol to use */ }; #include struct servent *pse; if( pse = getservbyname( “smtp”, “tcp” ) ) { /* Número da Porta: pse->s_port */ } else { /* Erro: nome do serviço não encontrado */ }

16 Revelando os Detalhes (3)  Identificando Protocolo pelo Nome: struct protoent { char * p_name;/* official protocol name */ char ** p_aliases;/* alias list */ int p_proto;/* official protocol number */ }; #include struct protoent *ppe; if( ppe = getprotobyname( “udp” ) ) { /* Número Oficial do Protocolo: ppe->p_proto */ } else { /* Erro: nome de protocolo não encontrado */ }

17 Servidores

18  Servidores Iterativos

19 Servidores  Servidor Concorrente TCP (com Conexão)

20 Servidores  Múltiplas conexões compartilhando dados:  Concorrência Aparente: I/O assíncrono  Concorrência por Threads

21 Servidores  I/O Assíncrono: select  Permite um processo esperar pelo primeiro descritor de arquivo (dentro de um conjunto) que esteja pronto. int select( int numfds, fd_set *in_fds, fd_set *out_fds, fd_set *exc_fds, struct timeval *timeout );  Conjunto de Descritores de Arquivo: Tipo do Dado: fd_set Macros de Manipulação: FD_ZERO ( fd_set *conjunto ) FD_SET ( int arquivo, fd_set *conjunto ) FD_ISSET ( int arquivo, fd_set *conjunto ) FD_CLR ( int arquivo, fd_set *conjunto )

22 Servidores int s1, s2, nfs; fd_set afds, rfds;... nfs = gettablesize(); FD_ZERO( &afds ); FD_SET( s1, &afds ); FD_SET( s2, &afds ); for(;;) { bcopy( (char*)&afds, (char*)&rfds, sizeof(rfds) ); if( select( nfs, &rfds, NULL, NULL, NULL) >= 0 ) { if( FD_ISSET(s1, &rfds) ) {s3 = accept( s1,... );... FD_SET( s3, &afds );... } if( FD_ISSET(s2, &rfds) ) {read( s2,... ); write( s2,... ); close( s2 ); FD_CLR( s2, &afds ); } } else /* Erro */ }

23 Protocolo de Aplicação  SMTP (Simple Mail Transfer Protocol)  HTTP (HiperText Transfer Protocol)  FTP (File Tranfer Protocol)


Carregar ppt "Desenvolvimento de Aplicações TCP/IP com Sockets Márcio de Sousa Dias"

Apresentações semelhantes


Anúncios Google