Anda di halaman 1dari 6

Programação sockets Cliente UDP

© 2002-2004 Volnys Bernal 1 © 2002-2004 Volnys Bernal 2

Agenda

‰ Resumo de Chamadas UDP


Cliente UDP ‰ Chamada socket()
‰ Chamada connect()
‰ Chamada send()
‰ Chamada recv()
Volnys Borges Bernal
volnys@lsi.usp.br ‰ Chamada sendto()
http://www.lsi.usp.br/~volnys ‰ Chamada recvfrom()
‰ Chamada close()

© 2002-2004 Volnys Bernal 3 © 2002-2004 Volnys Bernal 4

Resumo de Chamadas UDP

Lado Cliente Lado Servidor

Chamadas UDP socket() socket()

connect() bind()

send() recvfrom()

recv() sendto()

close() close()

© 2002-2004 Volnys Bernal 5 © 2002-2004 Volnys Bernal 6

Resumo de Chamadas UDP

Lado Cliente Lado Servidor

socket() socket()
Chamada socket()
bind()

sendto() recvfrom()

recvfrom() sendto()

close() close()

1
Programação sockets Cliente UDP

© 2002-2004 Volnys Bernal 7 © 2002-2004 Volnys Bernal 8

Chamada socket() Chamada socket()


‰ Objetivo ‰ Sintaxe
™ Criar um novo socket (plug de comunicação)
‰ Resultado sd = socket(int domain, int type, int protocol)
™ Retorna um descritor de arquivo.
‰ Sintaxe Socket Id. do protocolo
sd = socket (int domain, int type, int protocol) descriptor •UDP (17)
•TCP (6)
‰ Observação: Pilha de protocolos
Tipo da comunicação
™ Quando um socket é criado ele não possui nenhuma •PF_INET
informação armazenada (IPs e portas). •PF_INET6 •SOCK_STREAM (TCP)
™ Estas devem ser informadas nas chamadas bind() (lado •PF_X25 •SOCK_DGRAM (UDP, TCP)
servidor) e connect() (lado cliente). •SOCK_RAW (IP)

© 2002-2004 Volnys Bernal 9 © 2002-2004 Volnys Bernal 10

Chamada socket() Chamada socket()


‰ Tipo de serviço ‰ Exemplo de criação de socket TCP
™ SOCK_STREAM
ƒ Fluxo de bytes sem delimitação
ƒ Full duplex int sd;
ƒ Orientada a conexão
ƒ Comunicação confiável: . . .
• sem perda de dados, sem duplicação, entrega na ordem sd = socket(PF_INET, SOCK_STREAM, 6)
ƒ Deve ser utilizado com o protocolo TCP
ƒ Chamadas para transmissão e recepção de dados if (sd == -1)
• read(), write() ou send(), recv()
perror(“Erro na chamada socket”);
™ SOCK_DGRAM
ƒ Datagrama (mensagens) . . .
ƒ Deve ser utilizada com o protocolo UDP
ƒ Chamadas para trasnmissão e recepção de dados
‰ Obs:
• send(), recv()
™ SOCK_RAW ™ O valor 6 representa o protocolo TCP, foi obtido consultando
ƒ Permite acesso a protocolos de mais baixo nível /etc/protocols. Pode também ser obtido através de resolução de
ƒ Datagrama (mensagens) nomes via getprotobyname().
ƒ Chamadas para trasnmissão e recepção de dados
• send(), recv()

© 2002-2004 Volnys Bernal 11 © 2002-2004 Volnys Bernal 12

Chamada socket()
‰ Exemplo de criação de socket UDP

int sd;
. . .
Chamada Connect()
sd = socket(PF_INET, SOCK_DGRAM, 17)
if (sd == -1)
perror(“Erro na chamada socket”);
. . .

‰ Obs:
™ O valor 17 representa o protocolo UDP, foi obtido consultando
/etc/protocols. Pode também ser obtido através de resolução de nomes via
getprotobyname().

2
Programação sockets Cliente UDP

© 2002-2004 Volnys Bernal 13 © 2002-2004 Volnys Bernal 14

Chamada connect() Chamada connect()


‰ Objetivo Socket address
‰ Sintaxe (IP + porta)
do servidor
™ Define uma sessão de comunicação TCP, UDP ou IP
™ Informa à pilha da comunicação o endereço (IP+porta) do parceiro s = connect(int sd,
de comunicação struct socketaddr *serveraddr,
int size)
‰ Funcionamento
™ Deve ser executado no lado cliente
™ UDP:
Socket Tamanho da estrutura de
ƒ Não são enviados datagramas
descriptor endereço (sockaddr_in)
™ TCP:
ƒ Ativa o processo de estabelecimento de conexão TCP

© 2002-2004 Volnys Bernal 15 © 2002-2004 Volnys Bernal 16

Chamada connect()

int status; //estado da chamada


struct socketaddr_in serveraddr; //endereço do servidor
...

// define endereço destino


Chamada send()
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(serverport);
status =inet_pton(AF_INET,stringIP,serveraddr.sin_addr);
if (status <= 0)
perror(“Erro na conversão do endereço IP”);

// ativa connect
status = connect( socketdescriptor,
(struct sockaddr *)&serveraddr,
sizeof(serveraddr) );
if (status != 0)
perror(“Erro na chamada connect”);

© 2002-2004 Volnys Bernal 17 © 2002-2004 Volnys Bernal 18

Chamada send() Chamada send()


‰ Função para transmissão de dados ‰ Exemplo:
‰ Pode ser utilizada por clientes e servidores

. . .
status =
status = send(sd, msgp, msgsize, 0)
send(int sd, void * msgp, int msgsize, int flags) if (status <= 0)
perror(“Erro na chamada send”);
Socket Tamanho da Opções . . .
Descriptor mensagem

Ponteiro para mensagem


(end. do buffer da mensagem)

3
Programação sockets Cliente UDP

© 2002-2004 Volnys Bernal 19 © 2002-2004 Volnys Bernal 20

Chamada recv()

‰ Recebimento de datagramas
‰ Pode ser utilizada por clientes e servidores
Chamada recv()
status =
recv(int sd, void * buffer, int buffersize, int flags)

Socket Tamanho do Opções


Descriptor buffer

Ponteiro para o buffer


(end. do buffer de recepção)

© 2002-2004 Volnys Bernal 21 © 2002-2004 Volnys Bernal 22

Chamada recv() Chamada recv()


‰ Exemplo: ‰ Bloqueante
™ Se não existirem mensagens na fila de recepção o
. . . processo fica aguardando sua chegada
status = recv(sd, bufferp, buffersize, 0) ™ Exceção: quando o socket for criado como não

if (status <= 0) bloqueante (ver fcntl(2)).


perror(“Erro na chamada recv”);
. . . ‰ Retorno
™ Se a chamada tiver sucesso, o valor retornado é o
tamanho do datagrama

© 2002-2004 Volnys Bernal 23 © 2002-2004 Volnys Bernal 24

Chamada sendto()
‰ Função para transmissão de dados (datagramas
‰ Para um destino especificado
Chamada sendto() ‰ Não deve ser precedido por connect()
‰ Pode ser utilizada por cliente ou servidor

status =
sendto(int sd, void * msgp, int msgsize, int flags,
struct sockaddr *to, int sockaddrsize)

Socket Tamanho da Opções


Destino
Descriptor estrutura

Ponteiro para mensagem Tamanho da


(end. do buffer da mensagem) mensagem

4
Programação sockets Cliente UDP

© 2002-2004 Volnys Bernal 25 © 2002-2004 Volnys Bernal 26

Chamada sendto()
‰ Exemplo:

. . .
Chamada recvfrom()
status = sendto(sd, msgp, msgsize, 0,
(struct sockaddr *) &toaddr,
sizeof(struct sockaddr))
if (status <= 0)
perror(“Erro na chamada send”);
. . .

© 2002-2004 Volnys Bernal 27 © 2002-2004 Volnys Bernal 28

Chamada recvfrom() Chamada recvfrom()


‰ Recebimento de datagramas ‰ Exemplo:
‰ Permite obter a identificação do parceiro
. . .
‰ Pode ser utilizado pelo cliente ou servidor
size = sizeof(struct sockaddr_in);
status = status = recvfrom(sd, bufferp, buffersize, 0,
recvfrom(int sd, void * buffer, int buffersize, int flags (struct sockaddr *) &fromaddr,
struct sockaddr *from, int *sockaddrsize) &size);
if (status <= 0)
perror(“Erro na chamada recv”);
Tamanho da . . .
Socket Origem
Descriptor estrutura

Ponteiro para o buffer Tamanho do Opções


(end. do buffer de recepção) buffer

© 2002-2004 Volnys Bernal 29 © 2002-2004 Volnys Bernal 30

Chamada recvfrom()
‰ Bloqueante
™ Se não existirem mensagens na fila de recepção o
processo fica aguardando sua chegada
Chamada close()
™ Exceção: quando o socket for criado como não
bloqueante (ver fcntl(2)).

‰ Retorno
™ Se a chamada tiver sucesso, o valor retornado é o
tamanho do datagrama

5
Programação sockets Cliente UDP

© 2002-2004 Volnys Bernal 31 © 2002-2004 Volnys Bernal 32

Chamada close()
‰ Exemplo:

int sd; // socketdescriptor Exercício


. . .

status = close(sd);
if (status == -1)
perror(“Erro na chamada recv”);
. . .

© 2002-2004 Volnys Bernal 33 © 2002-2004 Volnys Bernal 34

Exercício Exercício

(1) Implemente um cliente para o serviço UDP echo. (2) Implemente um cliente para o serviço daytime UDP.

™ O serviço UDP echo responde exatamente com a ™ O serviço daytime UDP responde com a data e hora do
seqüência ASCII enviada. servidor no instante de recebimento do datagrama UDP.

© 2002-2004 Volnys Bernal 35 © 2002-2004 Volnys Bernal 36

Referências Bibliográficas
‰ COMMER, DOUGLAS; STEVENS, DAVID
™ Internetworking with TCP/IP: volume 3: client-server
programming and applications
Referências Bibliográficas
™ Prentice Hall
™ 1993

Anda mungkin juga menyukai