$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  14. Introdução Redes Sockets API Workflow Experimentos Perguntas
    Comunicação
    Gustavo Pantuza Sockets

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

  18. 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

    View Slide

  19. 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

    View Slide

  20. 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

    View Slide

  21. Introdução Redes Sockets API Workflow Experimentos Perguntas
    Arquitetura Cliente Servidor
    Gustavo Pantuza Sockets

    View Slide

  22. 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

    View Slide

  23. Introdução Redes Sockets API Workflow Experimentos Perguntas
    Workflow de um cliente socket
    Gustavo Pantuza Sockets

    View Slide

  24. Introdução Redes Sockets API Workflow Experimentos Perguntas
    Workflow de um servidor socket
    Gustavo Pantuza Sockets

    View Slide

  25. Introdução Redes Sockets API Workflow Experimentos Perguntas
    Workflow da comunicação Cliente/Servidor
    Gustavo Pantuza Sockets

    View Slide

  26. 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

    View Slide

  27. 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

    View Slide

  28. 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

    View Slide