Baixe o app para aproveitar ainda mais
Prévia do material em texto
Italo Valcy Programação em C, 2013.1 Programação C Italo Valcy <italo@dcc.ufba.br> Aula 10 – Programação em rede (Socket) Italo Valcy Programação em C, 2013.1 2 / 27 Todo o material aqui disponível pode, posteriormente, ser utilizado sobre os termos da: Creative Commons License: Atribuição - Uso não comercial - Permanência da Licença http://creativecommons.org/licenses/by-nc-sa/3.0/ Licença de uso e distribuição Italo Valcy Programação em C, 2013.1 3 / 27 Motivação Como duas aplicações distintas (dois processos) podem trocar informações entre si? Italo Valcy Programação em C, 2013.1 4 / 27 Motivação Como duas aplicações distintas (dois processos) podem trocar informações entre si? Região de memória compartilhada Qual endereço usar? Como permitir que outros processos acessem? Arquivo com acesso compartilhado Como tratar acesso concorrente? O desempenho é satisfatório? Italo Valcy Programação em C, 2013.1 5 / 27 Motivação Como duas aplicações distintas (dois processos) podem trocar informações entre si? Proposta: uso de sockets Unix domain sockets: escopo de comunicação apenas local Internet sockets: escopo de comunicação em rede (máquinas diferentes, até geograficamente distantes) Italo Valcy Programação em C, 2013.1 6 / 27 Observações Estudaremos apenas internet sockets Esse material foi desenvolvido para mostrar o uso de sockets, com a biblioteca socket.h (POSIX sockets, antiga BSD sockets) Nativa no Linux e BSD No Windows: Winsock (API ligeiramente diferente) Cygwin (lib de emulação do Unix) Italo Valcy Programação em C, 2013.1 7 / 27 Introdução Algumas premissas da Internet Necessidade de interoperabilidade (protocolos) Cada host é unicamente identificado (IP = Internet Protocol) Facilidade na adição de funcionalidades e separação de papéis (camadas, TCP/IP) Um host (IP) pode hospedar diversos serviços (porta virtual) Dentre outras premissas... Italo Valcy Programação em C, 2013.1 8 / 27 Introdução Número que identifica unicamente um host na internet (uma máquina, um servidor, um serviço, um dispositivo móvel, etc.) Formato: A.B.C.D (variando de 0 - 255) 192.168.0.1 200.128.0.31 189.238.12.260 Esgotamento IPv4: surgimento IPv6 2801:86:0:1:dad0:faca:b01a:ca5a É preciso conhecer o IP do peer/servidor Como saber o IP de um site? (disciplinas.dcc.ufba.br/MATA57) Endereço IP Italo Valcy Programação em C, 2013.1 9 / 27 Introdução Para efetuar comunicação na rede, você pode usar dois tipos de protocolo de transporte Orientado a conexão ou sem conexão Baseado em streams ou em pacotes Confiável ou não confiável (perda, duplicado, reordenado, corrompido, etc) Analogia na telefonia: chamada vs SMS Em termos de sockets: TCP ou UDP Protocolo de comunicação (transporte) Italo Valcy Programação em C, 2013.1 10 / 27 Introdução Na computação em rede, cada serviço, cada aplicação está acessível em determinado IP e em determinada porta Resumo: Além de conhecer o IP, você deve conhecer a porta Utilização das portas: 0 – 1023: reservadas (somente o administrador) 1024 – 49151: outras portas reservadas 49152 – 65535: portas dinâmicas Alguns exemplos (portas padrões): HTTP (web) => 80 HTTPS (web seguro) => 443 SMTP (e-mails) => 25 Remote Desktop (acesso windows) => 3389 Porta de comunicação Italo Valcy Programação em C, 2013.1 11 / 27 Introdução Uma comunicação pode ser denotada como uma quíntupla: IP de origem Porta de origem protocolo IP de destino Porta de destino Denotando uma comunicação Italo Valcy Programação em C, 2013.1 12 / 27 Introdução Na computação em rede, cada serviço, cada aplicação está acessível em determinado IP e em determinada porta Resumo: Além de conhecer o IP, você deve conhecer a porta Alguns exemplos (portas padrões): HTTP (web) => 80 HTTPS (web seguro) => 443 SMTP (e-mails) => 25 Remote Desktop (acesso windows) => 3389 Porta de comunicação Italo Valcy Programação em C, 2013.1 13 / 27 API de sockets 1. Comprar um telefone 2. Obter um número de telefone 3. Habilitar o recebimento de chamadas (aguardando nova chamada) – quantas ao mesmo tempo? 4. Atender o telefone 5. Efetuar chamadas 6. Falar 7. Ouvir 8. Encerrar a chamada Analogia à telefonia Italo Valcy Programação em C, 2013.1 14 / 27 API de sockets 1. socket() – cria um novo socket com determinado domínio, tipo, protocolo (Comprar um telefone) 2. bind() – associa um nome (IP:porta) ao socket (Obter um número de telefone) 3. listen() – especifica a quantidade de conexões simultâneas (habilita o recebimento de chamadas / chamadas simultâneas) 4. accept() – servidor aceita uma conexão de um cliente (Atender o telefone) 5. connect() – cliente requisita a conexão a um servidor (Efetuar chamadas) 6. send(), sendto() – enviar/escrever informações (Falar) 7. recv(), recvfrom() – receber/ler informações (Ouvir) 8. shutdown() – fechar o socket (Encerrar a chamada) Internet sockets Italo Valcy Programação em C, 2013.1 15 / 27 Sockets TCP Italo Valcy Programação em C, 2013.1 16 / 27 Sockets TCP socket(): cria o socket listen() – habilita o recebimento de conexões, especificando a quantidade de conexões simultâneas accept() – servidor aceita uma conexão de um cliente send() recv() – stream de leitura e escrita (repetido) shutdown() – encerra a conexão de um cliente close() – libera a estrutura do kernel Ações que o servidor executa Italo Valcy Programação em C, 2013.1 17 / 27 Sockets TCP socket(): cria o socket connect() – conecta ao servidor send(), recv() – stream de leitura e escrita (repetido) shutdown() – encerra a conexão com o servidor close() – libera a estrutura do kernel Ações que o cliente executa Italo Valcy Programação em C, 2013.1 18 / 27 API de socket Domain: AF_INET Type: SOCK_STREAM (TCP) SOCK_DGRAM (UDP) Procolo: Zero (0) – defini automaticamente o protocolo Retorno: Socket ID Italo Valcy Programação em C, 2013.1 19 / 27 API de socket sid: socket ID addrPtr: ponteiro para a estrutura de endereço local (internet ou unix sockets) len: tamanho de *addrPtr Estrutura de Socket Internet (precisa casting!) Italo Valcy Programação em C, 2013.1 20 / 27 API de socket sid: socket ID size: quantidade de conexões simultâneas Italo Valcy Programação em C, 2013.1 21 / 27 API de socket sid: socket ID addrPtr: ponteiro para a estrutura de endereço remoto (internet ou unix sockets) lenPtr: tamanho de *addrPtr Estrutura de Socket Internet (precisa casting!) Italo Valcy Programação em C, 2013.1 22 / 27 API de socket Estilo de accept(): Servidor interativo: apenas um cliente por vez Forking server: depois de aceitar, faz um fork() Servidor concorrente simples: usando select() para verificar sockets() em comunicação Italo Valcy Programação em C, 2013.1 23 / 27 API de socket Envio de mensagens: sid: socket ID Flag: 0 (padrão) Italo Valcy Programação em C, 2013.1 24 / 27 API de socket Recebimento de mensagens: sid: socket ID Flag: 0 (padrão) Italo Valcy Programação em C, 2013.1 25 / 27 API de socket Deve ser o primeiro passo para um cliente sid: socket ID addrPtr: ponteiro para a estrutura de endereço remoto (internet ou unix sockets) len: tamanho de *addrPtr Estrutura de Socket Internet (precisa casting!) Italo Valcy Programação em C, 2013.1 26 / 27 Exemplo completo Exemplo completo: https://disciplinas.dcc.ufba.br/svn/MATA57/2012.2/s rc/socket/ Italo Valcy Programação em C, 2013.1 27 / 27 Exercício Exer10: Implementar uma aplicação (cliente e servidor), onde dois clientes se conectam ao servidor para jogar o jogo da velha Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27
Compartilhar