sockets? Sockets são uma maneira de comunicar com outros processos através da Internet. Formalmente seria: Inter-Process Comunication (IPC) Gustavo Pantuza Sockets
criado pelo BSD (Berkeley Software Distribution) Seu primeiro release foi no formato de uma API em 1983 no Sistema Operacional Unix 4.2BSD Gustavo Pantuza Sockets
possível fazer com isso? Criar um servidor Web Definir novos protocolos na camada de aplicação Criar um servidor de Streamming Medir tempo, banda e latência ao longo da internet Fazer broadcast na rede Gustavo Pantuza Sockets
Existem dois tipos 1 de Sockets: Stream Sockets → Orientado a conexão Datagram Sockets → Não orientado a conexão 1Existem outros tipos de sockets, por exemplo raw sockets. No entanto eles não serão abordados. Gustavo Pantuza Sockets
protocolo TCP para transmitir os pacotes Canal exclusivo entre o cliente e o servidor Confiável e sem perda Garante a ordem dos pacotes enviados e recebidos Demora para recuperar de falhas de transmissão ou perda de pacotes Gustavo Pantuza Sockets
protocolo UDP para transmitir os pacotes Não possuí um canal dedicado/exclusivo entre servidor e cliente Não é totalmente confiável pois permite perda de pacotes A ordem dos pacotes não é uma garantia Permite recuperar rapidamente de erros/perdas de pacotes Gustavo Pantuza Sockets
Aparentemente, pelas características de cada tipo de socket, tende-se a achar que os SOCK_STREAM (TCP) são melhores do que os SOCK_DGRAM (UDP). No entanto, isso não é uma verdade. Tudo depende do objetivo e das características da aplicação que utilizará os sockets. Gustavo Pantuza Sockets
para VoIP, jogos ou transmissão de vídeos não necessita, na maioria dos casos, de controle de conexão, de recuperação de falhas ou retransmissão de pacotes. Logo, o ideal é utilizar o SOCK_DGRAM (UDP) Uma aplicação de trasferência de arquivos ou até mesmo um telnet precisa, necessariamente, de garantia de ordem de pacotes, reenvio em caso de falha. O que torna a aplicação confiável. Logo, se utiliza o SOCK_STREAM (TCP) Gustavo Pantuza Sockets
Sockets Estrutura de dados de endereços 2 : 1 /* Structure to contain information about address of a service provider. */ 2 struct addrinfo 3 { 4 int ai_flags; /* Input flags. */ 5 int ai_family; /* Protocol family for socket. */ 6 int ai_socktype; /* Socket type. */ 7 int ai_protocol; /* Protocol for socket. */ 8 socklen_t ai_addrlen; /* Length of socket address. */ 9 struct sockaddr *ai_addr; /* Socket address for socket. */ 10 char *ai_canonname; /* Canonical name for service location. */ 11 struct addrinfo *ai_next; /* Pointer to next in list. */ 12 }; 2código retirado do arquivo /usr/include/netdb.h. Linha 566 Gustavo Pantuza Sockets
Sockets Vamos conhecer primeiro as principais funções 7 e pra que servem: getaddrinfo(): Traduz nomes para endereços sockets. socket(): Cria um socket e retorna o descritor de arquivo. bind(): Associa o socket a um endereço socket e uma porta. connect(): Tenta estabelecer uma conexão com um socket. listen(): Coloca o socket para aguardar conexões. accept(): Aceita uma nova conexão e cria um socket. send(): caso conectado, transmite mensagens ao socket. recv(): recebe as mensagens através do socket. close(): desaloca o descritor de arquivo shutdown(): desabilita a comunicação do socket. 7Existem muitas outras funções. Veja o arquivo /usr/include/sys/socket.h. Além disso, utilize o utilitário man para ver o manual das funções Gustavo Pantuza Sockets
e Servidor? A grande diferença está na forma como se utiliza os sockets. Logo, tem-se uma versão da aplicação implementada para ser cliente e outra para ser servidor. Vejamos alguns exemplos: ssh: Cliente → ssh, servidor → sshd ftp: cliente → ftp, servidor → ftpd HTTP: cliente → chromium, servidor → Nginx Gustavo Pantuza Sockets
alguns exemplos e ler um pouco de código: netcat 1. Transferir um arquivo via socket 2. Um chat simples DNS: Tradução de um nome em um endereço IP Protocolos: Um protocolo de aplicação simples fork: Um exemplo de servidor que cria processos lsof: Ver os descritores de arquivos abertos pelos processos. netstat: Ver as portas e o estados das conexões. Gustavo Pantuza Sockets
hacker ; ] Leia os fontes de como o linux implementa sockets internamente: 1. /usr/include/sys/socket.h 2. /usr/include/bits/socket.h 3. /usr/include/netdb.h Volte no slide com as principais funções e leia o manual de cada uma utilizando o manual do linux. Ex: man socket, man bind procure artigos sobre o assunto. Ex: artigo Escreva algum programa sobre o assunto, por diversão Gustavo Pantuza Sockets