Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Redes de 
Computadores 
e Internet
R
ed
es d
e
 
C
o
m
p
u
tad
o
res 
e In
tern
et
Redes de 
Computadores 
e Internet
CONTEÚDO ONLINE
Douglas E. ComerDouglas E. Comer
D
o
u
g
las E
. C
o
m
er
6ª EDIÇÃO
6ª EDIÇÃO
6
ª E
D
IÇ
Ã
O
R
ed
es d
e
 C
o
m
p
u
tad
o
res e In
tern
et
Redes e Internet
D
o
u
g
las E
. C
o
m
er
6ª ED.
Escrito por um dos maiores especialistas em redes no mundo, 
Douglas E. Comer, este livro apresenta, de forma ampla e sistemática, 
os mais importantes conceitos, princípios e tecnologias das redes de 
computadores e da Internet. De fácil leitura, não requer experiência 
prévia com sistemas operacionais ou redes nem conhecimento 
avançado de matemática. Além disso, combina o melhor das 
abordagens top-down e bottom-up, permitindo aos professores 
adaptar o conteúdo às suas necessidades em sala de aula. Totalmente 
revisada e atualizada, esta nova edição inclui IPv4 e IPv6 em todos os 
capítulos e traz ainda tópicos emergentes e tendências, como a 
Internet das Coisas e as Redes Definidas por Software (SDN).
Acesse o nosso site, www.grupoa.com.br, 
cadastre-se gratuitamente, encontre a página 
do livro por meio do campo de busca e clique 
no link Conteúdo Online para fazer download 
do código para a API simplificada e de materiais 
extras para alunos e professores (em inglês).
www.grupoa.com.br
0800 703 3444
A Bookman Editora é um dos selos 
editoriais do Grupo A Educação, 
empresa que oferece soluções em 
conteúdo, tecnologia e serviços 
para a educação acadêmica e 
profissional.
COMPUTAÇÃO E TI
www.grupoa.com.br
BAEZA-YATES, R.; RIBEIRO-NETO, B.
Recuperação de Informação – Conceitos e Tecnologia das 
Máquinas de Busca – 2.ed.
COMER, D. E.
Redes de Computadores e Internet – 6.ed.
COULOURIS, G.; DOLLIMORE, J.; KINDBERG, T.; BLAIR, G.
Sistemas Distribuídos – Conceitos e Projeto – 5.ed.
FOROUZAN, B. A.
Comunicação de Dados e Redes de Computadores – 4.ed.
FOROUZAN, B. A.; FEGAN, S. C.
Protocolo TCP/IP - 3.ed
FOROUZAN, B. A.; MOSHARRAF, F.
Redes de Computadores – Uma Abordagem Top-Down
GOODRICH, M. T.; TAMASSIA, R.
Introdução à Segurança de Computadores
MCCARTHY, N. K.
Resposta a Incidentes de Segurança em Computadores – 
Planos para Proteção de Informação em Risco
MCCLURE, S.; SCAMBRAY, J.; KURTZ, G.
Hackers Expostos 7 – Segredos e Soluções para a 
Segurança de Redes – 7.ed.
WRIGHTSON, T.
Segurança de Redes Sem Fio – Guia do Iniciante
Catalogação na publicação: Poliana Sanchez de Araujo – CRB 10/2094
C732r Comer, Douglas E.
 Redes de computadores e internet [recurso eletrônico] /
 Douglas E. Comer ; tradução: José Valdeni de Lima, Valter
 Roesler. – 6. ed. – Porto Alegre : Bookman, 2016.
 Editado como livro impresso em 2016.
 ISBN 978-85-8260-373-4
 1. Redes de computadores. 2. Internet. I. Título. 
CDU 004.7
O autor
Dr. Douglas Comer é um internacionalmente reconhecido especialista em redes de com-
putadores, protocolos TCP/IP e Internet. Foi um dos pesquisadores que contribuíram 
com a formação da Internet no fim dos anos 1970 e nos anos 1980, sendo membro do In-
ternet Architecture Board, o grupo responsável por guiar o desenvolvimento da Internet. 
Também foi presidente do comitê técnico CSNET, membro do comitê executivo CSNET 
e presidente do Distributed Systems Architecture Board da DARPA (Defense Advanced 
Research Projects Agency). Foi ainda Vice-Presidente de Pesquisa na Cisco Systems.
Comer é consultor de projeto de redes de computadores para empresas e palestran-
te frequente em ambientes acadêmicos e profissionais ao redor do mundo. Seu sistema 
operacional, Xinu, e a implementação de protocolos TCP/IP (ambos documentados em 
seus livros) são utilizados em produtos comerciais. É professor honorário de Ciências 
da Computação na Purdue University, onde leciona redes de computadores, redes de 
internet, arquitetura de computadores e sistemas operacionais. Lá desenvolveu labora-
tórios de informática inovadores que dão aos alunos a oportunidade de ter experiências 
práticas na operação de sistemas, redes de computadores e protocolos. 
Além de escrever livros técnicos best-sellers, já traduzidos para 16 idiomas, atuou 
como editor norte-americano do periódico Software – Practice and Experience por 20 
anos. Comer é membro da ACM. Informações adicionais podem ser encontradas em: 
w ww.cs.purdue.edu/homes/comer.
http://www.cs.purdue.edu/homes/comer.
Capítulo 3 Programação em redes e aplicações da Internet 33
o esquema evita manter os dados em um servidor central. Conceitualmente, dados são 
distribuídos igualmente por N servidores, e cada requisição de cliente é enviada para 
o servidor mais apropriado. Como um determinado servidor somente fornece 1/N dos 
dados, a quantidade de tráfego entre o servidor e a Internet é 1/N quando comparado 
à arquitetura de servidor único. A ideia principal é que o software do servidor pode 
rodar no mesmo computador dos clientes. Se cada usuário concordar em localizar 1/N 
dos dados em seu computador, não serão necessários servidores especiais. A Figura 3.6 
ilustra a arquitetura. O exemplo mostra somente quatro computadores. Em um sistema 
p2p real, o tráfego em um computador pode ser extremamente pequeno, pois N pode ser 
extremamente grande (dezenas de milhares).
Internet
1/N de todo o tráfego
Figura 3.6 Interação exemplo em um sistema peer-to-peer.
3.13 Programação em redes e API de sockets
A interface utilizada pelas aplicações para comunicação na Internet é conhecida como 
interface de programas de aplicação (API, Application Program Interface)3. Embora os 
detalhes exatos de uma API dependam do sistema operacional, uma API particular tem 
emergido como um padrão de fato para softwares que se comunicam via Internet. Co-
nhecida como API de sockets e comumente abreviada como sockets, a API está disponí-
vel para muitos sistemas operacionais, como Microsoft Windows, Apple OS-X, Android 
e vários sistemas UNIX, incluindo o Linux. Em resumo:
A API de sockets, que se tornou o padrão de fato para comunicação via Inter-
net, está disponível na maioria dos sistemas operacionais.
O restante do capítulo descreve funções na API de sockets; leitores que não são progra-
madores podem pular os detalhes.
3.14 Sockets, descritores e E/S de rede
Pelo fato de ter sido desenvolvida originalmente como parte do sistema operacional 
UNIX, a API de sockets é integrada com a E/S (Entrada/Saída ou I/O, Input/Output). 
Em particular, quando uma aplicação cria um socket para comunicação na Internet, o 
sistema operacional retorna um pequeno descritor inteiro que identifica o socket. A apli-
cação então passa o descritor como um argumento quando ele chama funções para fazer 
3 O Apêndice 1 contém uma API simplificada (com somente sete funções) e um código-exemplo que demons-
tra como tal API pode ser utilizada para criar aplicações na Internet, incluindo um servidor Web funcional.
Comer_03.indd 33Comer_03.indd 33 29/10/15 14:4629/10/15 14:46
mmedeiros
Text Box
mmedeiros
Text Box
34 Parte I Introdução a redes e aplicações da Internet
a operação no socket (por exemplo, transferir dados através da rede ou receber dados 
que estão chegando).
Em muitos sistemas operacionais, descritores de sockets são integrados com ou-
tros descritores de E/S. Como resultado, uma aplicação pode utilizar as operações read e 
write tanto para E/S nos sockets quanto para E/S em arquivo. Para resumir:
Quando uma aplicação cria um socket, o sistema operacional retorna um pe-
queno descritor inteiro que a aplicação utiliza para referenciar o socket.
3.15 Parâmetros e API de sockets
Programação em sockets é diferente da E/S convencional, porque uma aplicação pre-
cisa especifica muitos detalhes, como o endereço do computador remoto, um número 
de porta para o protocolo e se a aplicação vai agir como cliente ou servidor (i.e., se vai 
iniciar a conexão). Para evitar uma única função de sockets com muitos parâmetros, 
os projetistas da API preferiram definirmuitas funções. Essencialmente, uma aplica-
ção cria o socket e então invoca as funções para especificar os detalhes. A vantagem 
da abordagem do socket é que a maioria das funções possui três ou quatro parâme-
tros; a desvantagem é que o programador deve lembrar-se de chamar múltiplas fun-
ções quando utiliza sockets. A Figura 3.7 resume as funções-chave da API de sockets.
Nome Usado por Signifi cado
accept servidor Aceita uma chamada entrante
bind servidor Especifi ca endereço IP e porta para o protocolo
close ambos Termina a comunicação
connect cliente Conecta com a aplicação remota
getpeername servidor Obtém o endereço IP do cliente
getsockopt servidor Obtém as opções atuais do socket
listen servidor Prepara o socket para uso do servidor
recv ambos Recebe dados ou mensagens entrantes
recvmsg ambos Recebe dados (no paradigma de mensagem)
recvfrom ambos Recebe uma mensagem e o endereço do transmissor
send ambos Envia mensagem ou dados
sendmsg ambos Envia uma mensagem
sendto ambos Envia uma mensagem (variante do sendmsg)
setsockopt ambos Muda as opções do socket
shutdown ambos Termina a conexão
socket ambos Cria o socket
Figura 3.7 Resumo das principais funções da API de sockets.
Capítulo 3 Programação em redes e aplicações da Internet 35
3.16 Chamadas de sockets em um cliente e em um servidor
A Figura 3.8 ilustra a sequência das chamadas de sockets efetuadas por típicos clientes 
e servidores que utilizam conexão via fluxo (confiável). Na figura, o cliente envia os 
dados primeiro e o servidor espera para recebê-los. Na prática, algumas aplicações são 
configuradas para que o servidor envie dados antes (i.e., send e recv são chamados na 
ordem inversa).
LADO DO CLIENTE LADO DO SERVIDOR
socket
connect
send
recv
close
socket
bind
listen
accept
recv
send
close
Figura 3.8 Ilustração da sequência das funções de socket chamadas por um cliente e um 
servidor usando o paradigma de fluxo (confiável).
3.17 Funções de sockets utilizadas em clientes e 
em servidores
3.17.1 A função socket
A função socket cria um socket e retorna um descritor inteiro.
descritor = socket(domain, type, protocol)
O argumento domain especifica a família de endereços que o socket vai utilizar. O iden-
tificador AF_INET especifica a versão 4 dos protocolos da Internet (IPv4) e o identifica-
dor AF_INET6 especifica a versão 6. O argumento type especifica o tipo de comunica-
ção que o socket vai utilizar: transferência de dados via fluxo (confiável) é especificada 
com SOCK_STREAM, e transferência de mensagens não orientada à conexão é especifi-
cada com o valor SOCK_DGRAM.
O argumento protocol especifica um protocolo particular de transporte que o so-
cket usa. Ter um argumento protocol além do argumento type permite a um único con-
junto de protocolos incluir dois ou mais protocolos para o mesmo serviço. Os valores 
que podem ser utilizados com o argumento protocol dependem da família de protocolos. 
Tipicamente, IPPROTO_TCP é utilizado com SOCK_STREAM, e IPPROTO_UDP é 
utilizado com SOCK_DGRAM.
Comer_03.indd 35Comer_03.indd 35 29/10/15 14:4629/10/15 14:46
36 Parte I Introdução a redes e aplicações da Internet
3.17.2 A função send
Tanto clientes como servidores utilizam a função send para transmitir dados. Tipicamen-
te, um cliente envia uma requisição e o servidor envia uma resposta. Send tem quatro 
argumentos:
send (socket, data, length, flags)
O argumento socket é o descritor do socket a utilizar. O argumento data é o en-
dereço na memória do dado a enviar. O argumento length é um inteiro especificando 
o número de bytes de dados a transmitir. O argumento flags contém bits que solicitam 
opções especiais4.
3.17.3 A função recv
Tanto clientes como servidores utilizam a função recv para obter dados que foram envia-
dos pelo outro. A função tem o formato:
recv (socket, buffer, length, flags)
O argumento socket é o descritor do socket através do qual o dado será recebido. O 
argumento buffer especifica o endereço na memória onde serão colocados os dados 
entrantes. O argumento length especifica o tamanho do buffer. Finalmente, o argu-
mento flags permite ao chamador controlar alguns detalhes (por exemplo, permitir 
que uma aplicação extraia uma cópia da mensagem que chega sem remover a mensa-
gem do socket). Recv bloqueia a aplicação até o dado chegar e então coloca até length 
bytes de dados no buffer (a função retorna o número de bytes que foram extraídos do 
pacote que chegou).
3.17.4 As funções read e write com sockets
Em alguns sistemas operacionais, como o Linux, as funções read e write podem ser 
utilizadas em vez de recv e send. Read possui três argumentos que são idênticos aos 
três primeiros da função recv, e write possui três argumentos que são idênticos aos três 
primeiros da função send.
A grande vantagem de utilizar read e write é a generalização – uma aplicação 
pode ser criada com o objetivo de transferir dados para ou a partir de um descritor 
sem saber se o mesmo corresponde a um arquivo ou um socket. Dessa forma, um 
programador pode utilizar um arquivo no disco local para testar um cliente ou um 
servidor antes de tentar se comunicar através da rede. A grande desvantagem de usar 
read e write é que o programa perde a portabilidade quando é compilado em outro 
sistema operacional.
4 Muitas opções são para depuração do sistema e não estão disponíveis para aplicações cliente-servidor con-
vencionais.
Capítulo 3 Programação em redes e aplicações da Internet 37
3.17.5 A função close
A função close avisa ao sistema operacional que ele deve encerrar o socket5. Possui a 
forma:
close (socket)
onde socket é o descritor do socket sendo encerrado. Se a conexão está aberta, close a 
termina (ou seja, informa ao interlocutor remoto). Fechar um socket interrompe seu uso 
imediatamente – o descritor é liberado, impedindo a aplicação de transmitir ou receber 
dados.
3.18 A função connect utilizada somente pelo cliente
O cliente chama a função connect a fim de estabelecer uma conexão com um servidor 
específico. A forma é:
connect (socket, saddress, saddresslen)
O argumento socket é o descritor do socket a utilizar na conexão. O argumento saddress 
é a estrutura sockaddr, que especifica o endereço do servidor (IP e porta)6. O argumento 
saddresslen especifica o tamanho do endereço do servidor medido em bytes.
Para um socket que utiliza o paradigma de fluxo (confiável), connect inicia a cone-
xão de nível de transporte com o servidor especificado. O servidor deve estar esperando 
a conexão (ver função accept descrita a seguir).
3.19 Funções de socket utilizadas somente pelo servidor
3.19.1 A função bind
Quando é criado, o socket não contém informações sobre o endereço IP local ou remoto 
e o número de porta. Um servidor chama bind para fornecer um número de porta no qual 
ele vai ficar esperando o contato. Bind possui três argumentos:
bind (socket, localaddr, addrlen)
O argumento socket é o descritor do socket em uso. O argumento localaddr é uma estru-
tura que especifica o endereço local a ser atribuído ao socket. O argumento addrlen é um 
inteiro que especifica o tamanho do endereço.
Como um socket pode ser utilizado com qualquer protocolo, o formato do endere-
ço depende do protocolo utilizado. A API de socket define uma forma genérica utiliza-
da para representar endereços, e então exige que cada família de protocolos especifique 
5 No sistema operacional Microsoft Windows, o nome da função é closesocket em vez de close.
6 A combinação de endereço IP e porta é algumas vezes chamada de endereço de endpoint (ponto de origem 
ou destino).
Comer_03.indd 37Comer_03.indd 37 29/10/15 14:4629/10/15 14:46
38 Parte I Introdução a redes e aplicações da Internet
como seus endereços de protocolos vão utilizar a forma genérica. O formato genérico 
para representar um endereço é definido na estrutura sockaddr. Embora muitas versões 
tenham sido liberadas, a maioria dos sistemas define a estrutura sockaddr com três 
campos:
structsockaddr {
u_char sa_len; /* tamanho total do endereço */
u_char sa_family; /* família do endereço */
char sa_data[14]; /* o endereço em si */
};
O campo sa_len consiste em um único octeto que especifica o tamanho do ende-
reço. O campo sa_family especifica a família à qual o endereço pertence (a constante 
simbólica AF_INET é utilizada para IPv4 e AF_INET6 para IPv6). Finalmente, o campo 
sa_data contém o endereço.
Cada família de protocolos define o formato exato usado no campo sa_data da 
estrutura sockaddr. Por exemplo, IPv4 utiliza a estrutura sockaddr_in para definir um 
endereço.
struct sockaddr_in {
u_char sin_len; /* tamanho total do endereço */
u_char sin_family; /* família do endereço */
u_short sin_port; /* número da porta do protocolo */
struct in_addr sin_addr;/* endereço IPv4 do computador */
char sin_zero[8]; /* não utilizado (configurado para zero) */
};
Os primeiros dois campos da estrutura sockaddr_in correspondem exatamente aos 
primeiros dois campos da estrutura genérica sockaddr. Os últimos três campos definem 
a forma exata do endereço IP. Vale a pena ressaltar dois pontos. Primeiro, cada campo 
identifica o computador e a porta do protocolo naquele computador. O campo sin_addr 
contém o endereço IP do computador e o campo sin_port contém o número da porta. 
Segundo, embora somente 6 bytes sejam necessários para armazenar um endereço IPv4 
e uma porta, a estrutura genérica sockaddr reserva 14 bytes. Assim, o campo final da 
estrutura sockaddr_in é um vetor de 8 bytes preenchido com zeros, que deixa a estrutura 
sockaddr_in do mesmo tamanho que sockaddr.
Nós dissemos que um servidor chama bind para especificar a porta na qual vai 
esperar as comunicações; entretanto, além da porta, a estrutura sockaddr_in contém 
o número IP do servidor. Embora ele possa utilizar um IP específico, fazer isso pode 
causar problemas quando o computador possui múltiplas conexões de rede, pois nes-
se caso ele tem também múltiplos endereços IP. A fim de permitir a um servidor ope-
rar em uma máquina com múltiplas conexões de rede, a API de sockets inclui uma 
constante simbólica especial, INADDR_ANY, que permite ao computador especificar 
um número de porta e estabelecer contato em qualquer um dos seus endereços IP. 
Resumindo:
Embora a estrutura sockaddr_in inclua um campo de endereço IP, a API de so-
cket fornece uma constante simbólica que permite ao servidor especificar uma 
porta de protocolo para qualquer um dos seus endereços IP no computador.
Capítulo 3 Programação em redes e aplicações da Internet 39
3.19.2 A função listen
Após utilizar bind para especificar uma porta, o servidor chama listen para colocar o 
socket no modo passivo, tornando-o pronto para esperar contato dos clientes. Listen 
possui dois argumentos:
listen (socket, queuesize)
O argumento socket é o descritor do socket. O argumento queuesize especifica um com-
primento para a fila de requisições de conexão do socket. Um sistema operacional cria 
filas de requisições separadas para cada socket. Inicialmente, a fila está vazia. Conforme 
as requisições chegam dos clientes, cada uma é inserida na fila. Quando o servidor soli-
cita recuperar uma requisição entrante no socket, o sistema extrai a próxima requisição 
da fila. O tamanho da fila é importante: se ela estiver cheia quando a requisição chegar, 
o sistema rejeita esta última.
3.19.3 A função accept
Um servidor chama accept para estabelecer uma conexão com o cliente. Se uma requisi-
ção de conexão está presente na fila, accept retorna imediatamente; se ainda não existem 
conexões, o sistema bloqueia o servidor até um cliente enviar uma requisição de cone-
xão. Uma vez que a conexão tenha sido aceita, o servidor a utiliza para interagir com o 
cliente. Após finalizar a comunicação, o servidor encerra a conexão.
A função accept tem a forma:
newsock = accept (socket, caddress, caddresslen)
O argumento socket é o descritor do socket que o servidor criou e associou (via bind) 
com uma porta específica. O argumento caddress é o endereço de uma estrutura do tipo 
sockaddr e caddresslen é um ponteiro para um inteiro. Accept preenche campos do ende-
reço caddress com o endereço do cliente que solicitou a conexão e configura caddresslen 
com o comprimento desse endereço. Finalmente, accept cria um novo socket para a cone-
xão e retorna o descritor do novo socket. O servidor utiliza o novo socket para se comu-
nicar com o cliente e fecha o socket quando finalizada a conexão. Enquanto isso, o socket 
original do servidor permanece sem modificações – após encerrar a comunicação com um 
cliente, o servidor utilizar o socket original para aceitar a próxima conexão de um cliente. 
Assim, o socket original é usado somente para aceitar as requisições de conexão, e toda co-
municação com um cliente ocorre por meio de um novo socket criado pela função accept.
3.20 Funções de socket utilizadas com o paradigma 
de mensagem
As funções de socket utilizadas para enviar e receber mensagens são mais complicadas 
do que as utilizadas com o paradigma de fluxo (confiável), porque muitas opções estão 
disponíveis. Por exemplo, um transmissor pode escolher se armazena o endereço do 
receptor no socket e somente envia dados ou se especifica o endereço do receptor a cada 
vez que uma mensagem é transmitida. Além disso, uma função permite ao transmissor 
Comer_03.indd 39Comer_03.indd 39 29/10/15 14:4629/10/15 14:46
40 Parte I Introdução a redes e aplicações da Internet
colocar o endereço e a mensagem em uma estrutura e passar o endereço da estrutura 
como um argumento, e outra função permite ao transmissor passar o endereço e a men-
sagem como argumentos separados.
3.20.1 Funções de socket sendto e sendmsg
As funções sendto e sendmsg permitem ao cliente ou servidor enviar uma mensagem 
utilizando um socket no paradigma de mensagens (sem conexão). Ambas requerem que 
o chamador especifique o destino. Sendto usa argumentos separados para a mensagem 
e endereço de destino:
sendto (socket, data, length, flags, destaddress, addresslen)
Os primeiros quatro argumentos correspondem aos quatro argumentos da função send; 
os últimos dois especificam o endereço de destino e o tamanho desse endereço. O ar-
gumento destaddress corresponde a uma estrutura do tipo sockaddr (especificamente, 
sockaddr_in).
A função sendmsg faz a mesma operação que sendto, mas abrevia os argumentos 
definindo uma estrutura. Uma lista menor de argumentos pode facilitar a legibilidade em 
programas que utilizem sendmsg:
sendmsg (socket, msgstruct, flags)
O argumento msgstruct é uma estrutura que contém informação sobre o endereço de 
destino, o tamanho do endereço, a mensagem a ser enviada e o tamanho da mensagem.
struct msgstruct { /* estrutura usada por sendmsg */
struct sockaddr *m_saddr; /* ponteiro para endereço de destino */
struct datavec *m_dvec; /* ponteiro para mensagem (vetor) */
int m_dvlength; /* número de itens do vetor */
struct access *m_rights; /* ponteiro para acessar a lista de direitos */
int m_alength; /* número de itens na lista */
};
Os detalhes da estrutura acima não são importantes – devem ser vistos como uma 
forma de combinar muitos argumentos em uma única estrutura. A maioria das aplica-
ções utiliza somente os três primeiros campos, que especificam o endereço de destino, 
uma lista de itens que constituem a mensagem e o número de itens dessa lista.
3.20.2 Funções recvfrom e recvmsg
Um socket no paradigma de mensagens (sem conexão) pode ser utilizado para receber 
mensagens de um conjunto arbitrário de clientes. Em tais casos, o sistema retorna o 
endereço do transmissor junto com cada mensagem que chega (o receptor utiliza esse 
endereço para enviar a resposta). A função recvfrom tem argumentos que especificam a 
localização da próxima mensagementrante e o endereço do transmissor.
recvfrom (socket, buffer, length, flags, sndraddr, saddrlen)
Capítulo 3 Programação em redes e aplicações da Internet 41
Os primeiros quatro argumentos são os mesmos da função recv; os dois argumentos 
adicionais, sndraddr e saddrlen, são utilizados para guardar o endereço IP do transmis-
sor, bem como seu tamanho. O argumento sndraddr é um ponteiro para uma estrutura 
do tipo sockaddr na qual o sistema escreve o endereço do transmissor. O argumento 
saddrlen é um ponteiro para um inteiro onde o sistema escreve o tamanho do endereço. 
Note que recvfrom guarda o endereço do transmissor na forma exata que o sendto espe-
ra, tornando fácil transmitir a resposta.
A função recvmsg, que é a contraparte do sendmsg, opera da mesma forma que o 
recvfrom, mas requer menos argumentos. Ela tem a forma:
recvmsg (socket, msgstruct, flags)
O argumento msgstruct dá o endereço da estrutura que armazena o endereço para uma 
mensagem entrante, bem como a localização do endereço IP do transmissor. A msgstruct 
gravada pela recvmsg usa exatamente o mesmo formato que a estrutura requerida pelo 
sndmsg, tornando fácil receber uma requisição, gravar o endereço do transmissor e então 
usar o endereço gravado para enviar uma resposta.
3.21 Outras funções de sockets
A API de sockets contém uma variedade de funções menores não descritas acima. Por 
exemplo, depois que um servidor aceita uma conexão, ele pode chamar getpeername 
para obter o endereço do cliente remoto que iniciou a conexão. Um cliente ou um servi-
dor pode também chamar gethostname para obter informações sobre o computador no 
qual está rodando.
Duas funções de objetivo geral são utilizadas para manipular opções de socket. A 
função setsockopt configura as opções de socket, enquanto getsockopt obtém as confi-
gurações atuais. As opções são utilizadas principalmente para lidar com casos especiais 
(por exemplo, para aumentar o tamanho interno de buffer).
Duas funções fornecem tradução entre endereços de Internet e nomes de compu-
tadores. A função gethostbyname retorna o endereço IP de um computador a partir do 
seu nome. Clientes geralmente chamam gethostbyname para traduzir um nome digitado 
por um usuário em seu endereço IP correspondente. A função gethostbyaddr fornece o 
mapeamento inverso – dado um endereço IP para um computador, retorna o nome desse 
computador. Clientes e servidores podem utilizar gethostbyaddr para traduzir um ende-
reço IP em um nome que o usuário possa entender.
3.22 Sockets, threads e herança
A API de sockets trabalha com servidores concorrentes. Embora os detalhes dependam 
do sistema operacional, as implementações de sockets aderem ao seguinte princípio da 
herança:
Cada nova thread que é criada herda da thread que a criou uma cópia de todos 
os sockets abertos.
Comer_03.indd 41Comer_03.indd 41 29/10/15 14:4629/10/15 14:46
42 Parte I Introdução a redes e aplicações da Internet
A implementação de socket utiliza um mecanismo de contagem de referência para 
controlar cada socket. Quando um socket é criado pela primeira vez, o sistema configura 
a contagem de referência desse socket para 1, e o socket existe enquanto essa contagem 
permanecer positiva. Quando o programa cria uma thread adicional, esta herda um pon-
teiro para cada socket aberto existente no programa, e o sistema incrementa a contagem 
de referência de cada socket em 1. Quando uma thread chama close, o sistema decremen-
ta a contagem de referência do socket; se a contagem chegar a zero, o socket é fechado.
Em termos de servidores concorrentes, a thread principal possui o socket utilizado 
para aceitar conexões. Quando uma solicitação de conexão chega, o sistema cria um 
novo socket para a nova conexão, e a thread principal cria uma nova thread para lidar 
com a conexão. Imediatamente após a thread ser criada, ambas as threads têm acesso ao 
socket original e também ao novo socket, e a contagem de referência de cada socket é 2. 
A thread original chama close para o novo socket, e a thread de serviço chama close para 
o socket original, reduzindo a contagem de referência deles para 1. Finalmente, quando 
termina de interagir com um cliente, a thread de serviço chama close no novo socket, 
reduzindo a contagem de referência para zero e causando o encerramento do socket. 
Dessa forma, o tempo de vida dos sockets num servidor concorrente pode ser resumido 
da seguinte forma:
O socket original utilizado para aceitar conexões existe enquanto a thread prin-
cipal está sendo executada; um socket utilizado para uma conexão específica 
existe somente enquanto existir a thread que trata daquela conexão.
3.23 Resumo
Na Internet, todos os serviços são fornecidos por aplicações que utilizam ou o paradig-
ma de fluxo ou o paradigma de mensagem para se comunicar. O paradigma de fluxo 
garante a entrega dos bytes na ordem correta, mas pode escolher quantos bytes vai pas-
sar ao receptor de cada vez. O paradigma de mensagem preserva os limites do pacote, 
porém permite que mensagens sejam perdidas, duplicadas, atrasadas ou entregues fora 
de ordem.
O modelo de comunicação básico utilizado pelas aplicações de rede é conhecido 
como modelo cliente-servidor. O programa que espera passivamente pelo contato é cha-
mado de servidor e o programa que inicia contato ativamente com o servidor é chamado 
de cliente.
Cada computador tem um endereço único, e cada serviço, tal como e-mail ou aces-
so Web, tem um identificador único conhecido como número de porta do protocolo. 
Quando um servidor inicia a execução, ele especifica o número da porta; quando for 
contatar o servidor, o cliente deve especificar tanto o endereço do servidor como o nú-
mero da porta do serviço.
Um único cliente pode acessar mais de um serviço, tanto em um servidor como em 
servidores localizados em múltiplas máquinas. Além disso, um servidor de um serviço 
pode se tornar um cliente de outros serviços. Projetistas e programadores devem ter cui-
dado para evitar dependências circulares entre servidores.
Uma interface de programa de aplicação (API, Application Program Interface) 
especifica os detalhes de como um programa de aplicação interage com a pilha de pro-
mmedeiros
Text Box
Encerra aqui o trecho do livro disponibilizado para 
esta Unidade de Aprendizagem. Na Biblioteca Virtual 
da Instituição, você encontra a obra na íntegra.
	Capa
	Iniciais
	Ficha catalográfica / O autor

Mais conteúdos dessa disciplina