Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Sockets em C

Sockets em C

Aula de redes sobre sockets

Gustavo Pantuza

September 01, 2014
Tweet

More Decks by Gustavo Pantuza

Other Decks in Programming

Transcript

  1. Redes de Computadores Sockets Gustavo Pantuza Departamento de Ciência da

    Computação - UFMG primeiro de Setembro, 2014
  2. Introdução Redes Sockets API Workflow Experimentos Perguntas O que são

    sockets? Sockets são uma maneira de comunicar com outros processos através da Internet. Formalmente seria: Inter-Process Comunication (IPC) Gustavo Pantuza Sockets
  3. Introdução Redes Sockets API Workflow Experimentos Perguntas Quem criou? Foi

    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
  4. Introdução Redes Sockets API Workflow Experimentos Perguntas O que é

    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
  5. Introdução Redes Sockets API Workflow Experimentos Perguntas E em relação

    às camadas de rede, onde ele fica? Bom, você deve ser familiarizado com isso: Gustavo Pantuza Sockets
  6. Introdução Redes Sockets API Workflow Experimentos Perguntas E em relação

    às camadas de rede, onde ele fica? e com isso: Gustavo Pantuza Sockets
  7. Introdução Redes Sockets API Workflow Experimentos Perguntas E em relação

    às camadas de rede, onde ele fica? e mais isso: Gustavo Pantuza Sockets
  8. Introdução Redes Sockets API Workflow Experimentos Perguntas E em relação

    às camadas de rede, onde ele fica? e aqui, reside a API Socket: Gustavo Pantuza Sockets
  9. Introdução Redes Sockets API Workflow Experimentos Perguntas Tipos de 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
  10. Introdução Redes Sockets API Workflow Experimentos Perguntas SOCK_STREAM Utiliza o

    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
  11. Introdução Redes Sockets API Workflow Experimentos Perguntas SOCK_DGRAM Utiliza o

    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
  12. Introdução Redes Sockets API Workflow Experimentos Perguntas Stream versus Datagram

    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
  13. Introdução Redes Sockets API Workflow Experimentos Perguntas Exemplos Uma aplicação

    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
  14. Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza

    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
  15. Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza

    Sockets Estrutura de dados de sockets 3 : 1 /* Structure describing a generic socket address. */ 2 struct sockaddr 3 { 4 __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ 5 char sa_data[14]; /* Address data. */ 6 }; 3código retirado do arquivo /usr/include/bits/socket.h. Linha 148 Gustavo Pantuza Sockets
  16. Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza

    Sockets Estrutura de dados IPv4 4 : 1 /* Internet address. */ 2 struct in_addr { 3 __be32 s_addr; 4 }; 5 ... 6 /* Structure describing an Internet (IP) socket address. */ 7 #define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ 8 struct sockaddr_in { 9 __kernel_sa_family_t sin_family; /* Address family */ 10 __be16 sin_port; /* Port number */ 11 struct in_addr sin_addr; /* Internet address */ 12 13 /* Pad to size of ‘struct sockaddr’. */ 14 unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - 15 sizeof(unsigned short int) - sizeof(struct in_addr)]; 16 }; 4Códigos retirados do arquivo /usr/include/linux/in.h. Gustavo Pantuza Sockets
  17. Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza

    Sockets Estrutura de dados IPv6 5 : 1 struct in6_addr { 2 union { 3 __u8 u6_addr8[16]; 4 __be16 u6_addr16[8]; 5 __be32 u6_addr32[4]; 6 } in6_u; 7 #define s6_addr in6_u.u6_addr8 8 #define s6_addr16 in6_u.u6_addr16 9 #define s6_addr32 in6_u.u6_addr32 10 }; 11 struct sockaddr_in6 { 12 unsigned short int sin6_family; /* AF_INET6 */ 13 __be16 sin6_port; /* Transport layer port # */ 14 __be32 sin6_flowinfo; /* IPv6 flow information */ 15 struct in6_addr sin6_addr; /* IPv6 address */ 16 __u32 sin6_scope_id; /* scope id (new in RFC2553) */ 17 }; 5Códigos retirados do arquivo /usr/include/linux/in6.h. Gustavo Pantuza Sockets
  18. Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza

    Sockets Famílias de protocolos e endereços 6 : 1 /* Protocol families. */ 2 #define PF_INET 2 /* IP protocol family. */ 3 #define PF_INET6 10 /* IP version 6. */ 4 5 ... 6 7 /* Address families. */ 8 #define AF_INET PF_INET 9 #define AF_INET6 PF_INET6 6Código retirado do arquivo /usr/include/bits/socket.h Gustavo Pantuza Sockets
  19. Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza

    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
  20. Introdução Redes Sockets API Workflow Experimentos Perguntas Como diferenciar Cliente

    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
  21. Introdução Redes Sockets API Workflow Experimentos Perguntas Experimentos Vamos executar

    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
  22. Introdução Redes Sockets API Workflow Experimentos Perguntas seja curioso, seja

    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
  23. Introdução Redes Sockets API Workflow Experimentos Perguntas Dúvidas? Contatos: email:

    [email protected] github: pantuza twitter: @gpantuza site: http://pantuza.com Gustavo Pantuza Sockets