Title: Introdu
1Introdução à Programação com Sockets
- Fernando Jorge Silveira Filho
- fernando_at_land.ufrj.br
- Daniel Sadoc Menasché
- sadoc_at_land.ufrj.br
2Visão Geral
- Objetivos
- Realizar comunicação entre processos.
- Entender como usar as funções da API sockets.
- Histórico da API sockets desenvolvida na época
da implementação dos protocolos TCP/IP pelo grupo
da UC, Berkeley. - Inicialmente iremos (re)ver alguns conceitos que
serão importantes.
3(No Transcript)
4Conceitos Importantes
- Argumentos de Valor/Resultado
- Descritores de Arquivo
- Chamadas de Sistema de E/S
- Byte Ordering
- Portas e Endereços IP
- Associações Conexões
- Serviços de Transporte
5Argumentos de Valor/Resultado
- É possível (e comum) na linguagem C, utilizar o
recurso de passagem de argumentos por referência
para passar valores para uma função ao mesmo
tempo em que se espera um valor de retorno na
mesma variável. - Exemplo imagine uma função is_prime() que
retorna 1 se um número apontado por um ponteiro n
é primo e 0 (zero) se composto. Neste último
caso, a função também retorna o número primo mais
próximo do valor passado. Este segundo valor de
retorno pode ser colocado no próprio endereço de
memória referenciado por n.
int is_prime( int n ) / verifica se (n)
é primo e em caso negativo coloca o primo
mais próximo em (n) /
6(No Transcript)
7(No Transcript)
8(No Transcript)
9(No Transcript)
10(No Transcript)
11(No Transcript)
12Serviços de Transporte
- A camada de transporte dos protocolos TCP/IP
fornece duas opções de tipos de serviço - Serviço orientado a conexão utiliza o protocolo
TCP (Transmission Control Protocol) e garante
entrega e ordenação. - Serviço datagrama utiliza o protocolo UDP (User
Datagram Protocol) e não faz nenhuma garantia.
13(No Transcript)
14(No Transcript)
15(No Transcript)
16(No Transcript)
17(No Transcript)
18(No Transcript)
19(No Transcript)
20Sockets TCP
- Sockets orientados a conexão com garantias de
entrega e ordenação. - É preciso estabelecer a conexão antes da troca de
dados. - O servidor cria um socket especial para escutar
pedidos de conexão do cliente. - Cada vez que o servidor aceita um pedido de
conexão recebido no socket de escuta, um novo
socket é criado para realizar a comunicação.
Assim é possível para o servidor voltar a aceitar
novos pedidos de conexão mais tarde (usando o
socket de escuta).
21(No Transcript)
22(No Transcript)
23(No Transcript)
24(No Transcript)
25Atenção para uma Armadilha!
- As funções
- read, recv, recvfrom, write, send e sendto
- podem retornar menos bytes do que a quantidade
requisitada, e nenhuma mensagem de erro é
retornada neste caso! - Solução ao usar as funções recv, recvfrom, send
e sendto pode-se (deve-se!) passar como parâmetro
a flag MSG_WAITALL.
26(No Transcript)
27(No Transcript)
28(No Transcript)
29Servidores Concorrentes
- Muitas vezes é necessário para um servidor lidar
com vários clientes de uma única vez. Para
conseguir isto é preciso, de alguma maneira,
voltar a aceitar conexões, sem esperar que um
cliente seja completamente servido. - Isto normalmente é feito através da criação de
novas threads ou novos processos. - Um servidor, após o retorno da função accept(),
se divide em dois, e enquanto uma linha de
execução se dedica a atender o cliente, outra
volta a esperar por novos pedidos de conexão.
30Servidores concorrentesEsquema de um Servidor
Típico
for( ) connfd accept(listenfd, ...)
if ( ( pid fork() ) 0 ) close(listenfd)
doit(connfd) close(connfd) exit(0)
close (connfd)
- pid_t pid
- int listenfd, confd
- listenfd socket(...)
- bind(listenfd, ...)
- listen(listenfd, LISTENQ)
31(No Transcript)
32Sockets UDP
- Sockets sem conexão e sem garantias de entrega ou
ordenação. - Só é preciso saber o endereço de destino antes de
enviar dados. É possível receber dados a qualquer
momento e de qualquer um. Usamos as funções
sendto() e recvfrom(). - Pode-se ainda usar a função connect() com sockets
UDP, mas o seu significado aqui é diferente, uma
vez que NÃO faz sentido falar em uma conexão UDP.
Para sockets UDP, a função connect() apenas
fixa o endereço conectado. Assim é possível
usar as funções send() e recv() como para sockets
TCP.
33(No Transcript)
34(No Transcript)
35(No Transcript)
36(No Transcript)
37(No Transcript)
38Depurando Passo 0,Exibindo mensagens de aviso
- Esta é a forma mais simples de depurar aplicações
que envolvem sockets, threads e mais de um
processo. - Atenção! Deve-se gerar as mensagens de aviso em
stderr (que não possui buffer) e não stdout! - Inconveniente desta técnica de depuração pode
afetar o funcionamento do programa.
39Depurando Passo 1,A Máquina de Estados
Comando chave netstat -a
40Depurando Passo 1, A Máquina de Estados do TCP
Comando chave netstat -a
sadoc_at_copa src netstat -a grep 32568 Proto
Local Address Foreign Address State tcp
32568 LISTEN tcp
localhost47415 localhost32568 ESTABLISHED tcp
localhost32568 localhost47415 ESTABLISHED
sadoc_at_copa src netstat -a grep 32568 tcp
localhost47415 localhost32568 CLOSE_WAIT tcp
localhost32568 localhost47415 FIN_WAIT2
wildcard
41Depurando Passo 2,O comando tcpdump
- tcpdump -x src host_name gt log_file
- Programa equivalente, com interface gráfica
ethereal
Fonte dos pacotes
Imprime o conteúdo de cada pacote,em hexadecimal
42Lições Aprendidas
43Bibliografia Recomendada
- Stevens, W. R. UNIX Network Programming Volume
I Networking APIs Sockets and XTI - Stevens, W.R. TCP/IP Illustrated vol.1
- Besaw, L. BSD Sockets Reference (formato
PostScript (.ps) em www.land.ufrj.br/classes/tp/i
ndex-103.html).