Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouLeonardo Reposa Alterado mais de 9 anos atrás
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)
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.