Você está na página 1de 10

Sockets

• Objetivo
– Verificar na prática o funcionamento de sockets e troca de
mensagens
• Roteiro
– Sockets
– Sockets no Linux
– Modelo cliente/servidor
– Chamadas de sistema
– Estruturas de dados
– Conversão de formatos
• Referência base
– Prof. Carlos Maziero/PUCPR
– http://www.ppgia.pucpr.br/~maziero/ensino/pua/rede/index.html
INF01151 – Sistemas Operacionais II N – 2006/2
Prof. Cláudio Geyer / Rômulo Rosinha
O que é um socket?
• Um socket é uma abstração que indica a
extremidade final de um canal de comunicação
• Na prática, um socket é uma interface de
comunicação bidirecional entre processos
• Em outras palavras, um socket é por onde um
processo envia ou recebe dados de outros
processos
• Associados a um socket existem diversos
modelos e primitivas para a realização da
comunicação entre processos distintos

INF01151 – Sistemas Operacionais II N – 2006/2


Prof. Cláudio Geyer / Rômulo Rosinha
Sockets no Linux
• Linux utiliza sockets como abstração geral para
vários tipos de entrada e saída
• No que diz respeito a redes, o Linux implementa
a interface conhecida como Berkeley socket
interface
– Uma biblioteca C lançada em 1983 como parte do
BSD 4.2
– Define um conjunto de funções que permitem a troca
de dados entre processos
– Considerada o padrão de facto para uma interface de
programação de rede

INF01151 – Sistemas Operacionais II N – 2006/2


Prof. Cláudio Geyer / Rômulo Rosinha
Sockets no Linux
• A interface é definida basicamente nos seguintes
arquivos
– <sys/socket.h>: definições das funções e tipos de dados básicos
– <sys/types.h>: definições de tipos de dados
– <netinet/in.h>: definições de tipos de dados relacionados a
endereços
• Ela oferece chamadas de sistema e funções para
– Criação e associação de endereço do socket
– Conexão e desconexão de um socket
– Escuta e aceite de conexões
– Envio e recebimento de dados
– Manipulação de endereços
– Etc.

INF01151 – Sistemas Operacionais II N – 2006/2


Prof. Cláudio Geyer / Rômulo Rosinha
Sockets no Linux
• São 3 formas de comunicação usando sockets:
– Raw sockets: baixo nível, usado por processos que gerenciam ou monitoram a
infra-estrutura de rede.
– Datagram sockets: mais alto nível, permite comunicação bidirecional não
confiável (não existe garantia quanto a entrega e a ordem de entrega dos
pacotes).
– Stream sockets: mais alto nível, permite comunicação bidirecional ponto-a-
ponto confiável (sem perdas, sem duplicações e com garantia da ordem de
entrega dos pacotes).
• Além disso, também é necessário definir um espaço de nomes, os mais
usados são:
– PF_LOCAL: indica comunicação local, para comunicação entre processos na
mesma máquina.
– PF_INET: indica comunicação usando IPv4, para comunicação entre processos
em máquinas distintas.
• Por fim, é preciso definir o protocolo a ser utilizado. Normalmente existe
apenas um protocolo para cada combinação forma de comunicação/espaço
de nomes. Por isso, normalmente utiliza-se o valor 0 para indicar o
protocolo padrão para essa combinação.

INF01151 – Sistemas Operacionais II N – 2006/2


Prof. Cláudio Geyer / Rômulo Rosinha
Modelo cliente/servidor
• Um cliente normalmente executa os seguintes
passos para estabelecer uma comunicação
com um servidor:
1. Cria um socket, usando a chamada de sistema
socket;
2. Conecta seu socket ao endereço do servidor,
usando a chamada de sistema connect;
3. Envia e recebe dados através do socket, usando as
chamadas de sistema read e write;
4. Encerra a comunicação, fechando o socket através
da chamada close.

INF01151 – Sistemas Operacionais II N – 2006/2


Prof. Cláudio Geyer / Rômulo Rosinha
Modelo cliente/servidor
• Um servidor normalmente executa os seguintes passos
para oferecer serviço a seus clientes:
1. Cria um socket, usando a chamada de sistema socket;
2. Associa um endereço a seu socket, usando a chamada de
sistema bind;
3. Coloca o socket em modo de escuta, através da chamada de
sistema listen;
4. Aguarda um pedido de conexão, através da chamada accept
(que gera um descritor específico para a conexão recebida);
5. Envia e recebe dados através do socket, usando as chamadas
de sistema read (ou recv) e write (ou send);
6. Encerra a comunicação com aquele cliente, fecha o descritor da
conexão usando a chamada close;
7. Volta ao passo 4, ou encerra suas atividades fechando seu
socket usando a chamada close.

INF01151 – Sistemas Operacionais II N – 2006/2


Prof. Cláudio Geyer / Rômulo Rosinha
Chamadas de sistema
• Abaixo está a lista de chamadas de sistema definidas pela interface
• Consulte a referência base deste material ou a documentação man no Linux para
maiores detalhes
int socket(int domain, int type, int protocol);
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
int listen(int sockfd, int backlog);
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int send(int sockfd, const void *msg, int len, int flags);
int recv(int sockfd, void *buf, int len, unsigned int flags);
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct
sockaddr *to, socklen_t tolen);
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr
*from, int *fromlen);
close(sockfd);
int shutdown(int sockfd, int how);

INF01151 – Sistemas Operacionais II N – 2006/2


Prof. Cláudio Geyer / Rômulo Rosinha
Estruturas de dados
• Estrutura para um endereço de socket utilizada em muitas chamadas
struct sockaddr {
unsigned short sa_family; // tipo de endereço, por exemplo AF_LOCAL ou AF_INET
char sa_data[14]; // 14 bytes para o endereço do protocolo
};

• Quando se programa no espaço de nomes Internet, pode-se utilizar a


seguinte estrutura de mais alto nível e que é equivalente
struct sockaddr_in {
short int sin_family; // tipo de endereço, por exemplo AF_INET
unsigned short int sin_port; // número da porta (em network byte order)
struct in_addr sin_addr; // endereço ip (em network byte order)
unsigned char sin_zero[8]; // para deixar a estrutura com o mesmo tamanho
};

• O campo sin_addr tem a seguinte estrutura


struct in_addr {
unsigned long s_addr; // that's a 32-bit long, or 4 bytes
};

INF01151 – Sistemas Operacionais II N – 2006/2


Prof. Cláudio Geyer / Rômulo Rosinha
Conversões de formato
• Alguns campos da estrutura de endereço são
armazenados em um formato padronizado
conhecido como Network Byte Order
• A interface oferece funções de conversão
short htons (short) // converte Host to Network Short
short ntohs (short) // converte Network to Host Short
long htonl (long) // converte Host to Network Long
long ntohl (long) // converte Network to Host Long

• Existem ainda mais duas funções auxiliares


int inet_aton(const char *cp, struct in_addr *inp); // converte de nnn.nnn.nnn.nnn
para o tipo in_addr
char *inet_ntoa(struct in_addr in); // converte do tipo in_addr para
nnn.nnn.nnn.nnn

INF01151 – Sistemas Operacionais II N – 2006/2


Prof. Cláudio Geyer / Rômulo Rosinha

Você também pode gostar