Escolar Documentos
Profissional Documentos
Cultura Documentos
1
1.1 Introduo
Aplicaes clientes so conceitualmente mais simples que aplicaes servidoras pois,
normalmente, no manipulam concorrncia explicita com mltiplos servidores, nem necessitam de
privilgios e mecanismos de proteo especiais.
Elaborado por Magda Patrcia Caldeira Arantes e revisado por Juan Manuel Adn Coello.
2
cliente pode ser projetado para mudar o nome do servidor, dentro de um grupo, at conseguir uma
resposta.
*/
*/
*/
*/
*/
Os campos que contm nomes e endereos devem ser listas porque os hospedeiros podem ter
vrias interfaces e vrios nomes e endereos. Para garantir compatibilidade com verses anteriores, o
arquivo tambm define o identificador h_addr para se referir primeira posio na lista de endereos
do hospedeiro.
Todos os endereos retornados pelas funes anteriores esto na ordem de bytes da rede.
3
Exemplo: Converso de nome. Para obter o endereo IP do hospedeiro merlin.cs.purdue.edu, o
cliente recebe o nome do domnio e chama gethostbyname.
struct hostent
*hptr;
char *hnome="merlin.cs.purdue.edu";
if (hptr=gethostbyname(hnome)) {
/*
O endereo IP est em hptr->h_adrr */
} else {
/*
erro, trate-o
*/
};
Se a chamada for bem sucedida, gethostbyname retorna um ponteiro para uma estrutura hostent
vlida. Se o nome de domnio passado no puder ser mapeado em um endereo IP o valor retornado ser
zero. Examinando o valor retornado o cliente poder determinar a ocorrncia de erro.
4
A funo de biblioteca getservbyname pode ser usada para esta finalidade. A funo recebe como
parmetro duas cadeias de caracteres que especificam o servio desejado e o protocolo usado, retornando
um ponteiro para a estrutura servent que est definida no arquivo netdb.h.
struct servent {
char *s_name;
char **s_aliases;
int
s_port;
char *s_protocol;
};
/*
/*
/*
/*
Se um cliente TCP precisar do nmero de porta oficial para o protocolo SMTP, ele chama a funo
gethostbyname, conforme descrito a seguir:
struct servent
*sptr;
if (sptr=getservbyname("smtp","tcp")) {
/*
O nmero da porta est em sptr->s_port
} else {
/*
ocorreu erro, manipule-o
*/
};
*/
Um cliente pode procurar o nmero da porta oficial para o protocolo UDP chamando a funo
getprotobyname conforme descrito a seguir:
struct protoent *pptr;
if (pptr=getprotobyname("udp")) {
/*
O nmero da porta est em
pptr->p_proto
*/
} else {
/*ocorreu erro, manipule-o */
};
1. 9 Alocando um soquete
Nas sees anteriores foi discutido como encontrar o endereo IP de um servidor e a funo
soquete foi usada para alocar um soquete de comunicao. Clientes que usam o TCP devem especificar a
famlia de protocolos PF_INET e o servio SOCK_STREAM. Um programa comea com comandos de
incluso dos arquivos que contm as definies das constantes simblicas usadas nas chamadas de
funes, seguidas das declaraes das variveis usadas para guardar o descritor do soquete. Se na famlia
de protocolos especificada pelo primeiro argumento, mais de um protocolo oferecer o servio
especificado pelo segundo argumento, o terceiro argumento deve identificar o protocolo desejado. No
conjunto de protocolos da Internet apenas o TCP oferece o servio SOCK_STREAM, ento o terceiro
argumento irrelevante.
Abaixo dado um exemplo de chamada a socket():
#include <sys/types.h>
#include <sys/socket.h>
int
s;
/* descritor do soquete */
s = socket(PF_INET,SOCK_STREAM,0);
onde:
s
remaddr
o descritor do soquete;
o endereo da estrutura sockaddr_in que especifica o
endereo remoto com o qual a conexo desejada;
remaddrlen o comprimento (em bytes) do segundo argumento.
8
Por exemplo, considere que um cliente e um servidor se comunicam atravs de interaes
requisio-resposta.. O software cliente envia pedidos aos quais o servidor responde. O servidor no
pode terminar a conexo porque ele no sabe se o cliente enviar pedidos adicionais. O cliente sabe que
no tem mais pedidos para enviar, entretanto, no sabe se todos os dados enviados pelo servidor j foram
recebidos, especialmente se operao realizada for transferncia de dados, em resposta a pedidos de
consulta a base de dados.
O argumento direction um inteiro. Se for 0 (zero) nenhuma entrada posterior permitida, se for 1
nenhuma sada posterior permitida e se for 2 a conexo derrubada nas duas direes.
A vantagem do encerramento parcial deveria ser agora clara: quando um cliente termina o envio de
pedidos ele usa a primitiva shutdown para especificar que no tm mais dados para enviar, sem desalocar
o soquete. O protocolo subjacente reporta o fechamento mquina remota, onde a aplicao servidora
recebe um sinal de fim de arquivo. Uma vez que o servidor tenha detectado o fim de arquivo, ele sabe
que nenhuma requisio chegar. Aps enviar sua ltima resposta, o servidor poder fechar a conexo.
Resumindo:
O mecanismo de encerramento parcial remove a ambigidade de protocolos de aplicao que
transmitem quantidades arbitrrias de informao em resposta a uma requisio. Nesses casos,
o cliente faz um encerramento da conexo aps a sua ltima requisio; o servidor fecha a
conexo aps enviar sua ltima resposta.
10
Embora um cliente UDP simplista possa funcionar bem em redes locais que exibem baixa perda, pequeno
atraso, e no reordenam pacotes, este algoritmo no funciona bem em inter-redes (internets) complexas.
Para trabalhar em um ambiente inter-rede, um cliente deve implementar confiabilidade usando
temporizadores (timeouts) e retransmisses. Ele deve tambm deve tratar dos os problemas da duplicao
e reordenao de pacotes. Adicionar confiabilidade pode ser difcil e requer conhecimentos de projeto de
protocolos.
O software cliente que usa UDP deve implementar confiabilidade usando tcnicas como
seqenciamento de pacotes e reconhecimentos, timeouts e retransmisses. Projetar protocolos corretos,
confiveis e eficientes para ambientes inter-redes requer uma experincia considervel.
Bibliografia
COMER, D. E., STEVENS, D. L., Internetworking With TCP/IP Volume III: Client-Server
Programming and Applications, Linux/POSIX Socket Version, Prentice-Hall International 2001,
Captulo 6.