Programação com Sockets TCP e UDP - Cliente Gustavo Leitão 5/24/2010
INTRODUÇÃO Objetivo da Aula
OBJETIVO DA AULA Apresentar ao aluno conceitos e prática em sockets
INTRODUÇÃO O que é um socket?
INTRODUÇÃO O que é um Socket? Segundo Brian Beej Hall é a interface que permite conversar com outros programas De acordo com James F Kurose: socket é a interface entre a camada de aplicação e a de transporte dentro de uma máquina.
INTRODUÇÃO Características Uma das primeiras formas de programação distribuída (programas podem ser executados em uma ou diversas máquinas) Baseado no modelo de comunicação Cliente/Servidor Utiliza um protocolo de transporte (UDP, TCP)
ARQUITETURA DE REDE Socket Aplicação (FTP, HTTP, SMTP) Transporte (TCP e UDP) Rede (IP) Enlace (Ethernet) Aplicação (FTP, HTTP, SMTP) Transporte (TCP e UDP) Rede (IP) Enlace (Ethernet)
TIPOS DE SOCKETES TCP x UDP TCP Orientado a Conexão Controle de Erro Garante Entrega Entrega Ordenada x UDP Não necessita de conexão Não Possui controle de erro Mais simples e rápido
TIPOS DE SOCKETS 5/24/2010
BYTE ORDER Alguns computadores armazenam os números em Big-Endian, ou seja, o Byte mais significativo primeiro Ex: O número de dois bytes em hexadecimal representado por 4b5f será armazenado na seguinte ordem: 4b 5f Porém outros computadores (x86, Intel, Motorola, etc) armazenam seus dados em Little-Endian, ou seja, o byte menos significativo primeiro Ex: O número 4b5f seria armazenado na seguinte ordem: 5f 4b
BYTE ORDER Big-Endian é também chamado de Network Byte Order, por que é a forma como os dados devem ser transmitidos em rede. Seu computador, porém armazena números em Host Byte Order (Little- Endian)
BYTE ORDER Para resolver esse problema temos as seguinte funções: htons() host to network short htonl() host to network long ntohs() network to host short ntohl() network to host long
CHAMADAS DE SISTEMA socket (protofamily,type,protocol) bind (socket,localaddr,addrlen) listen (socket,queuesize) accept (socket,caddress,caddresslen) connect (connect,saddress,saddresslen) send (socket,data,lenght,flags) recv (socket,buffer,lenght,flags) close (socket)
PROGRAMA TÍPICO Servidor socket(); Cliente bind(); socket(); listning(); accept(); Aguardando Conexão connect(); receiv(); send(); close(); send(); receiv(); close();
PROGRAMA TÍPICO Socket - Acesso ao Descritor de Arquivo! int socket(int domain, int type, int protocol); #include <sys/types.h> #include <sys/socket.h> //Criando o socket (internet, TCP, IP) int socketfd = socket(af_inet, SOCK_STREAM, 0)); if (socketfd == -1 ){ perror( Error socket() ) ; exit ( 1 ) ; } Domínios: AF_UNIX, AF_LOCAL - Comunicação Local AF_INET - IPv4 AF_INET6 IPv6 Tipos: SOCK_STREAM - TCP SOCK_DGRAM - UDP
EXEMPLO 1 5/24/2010
PROGRAMA TÍPICO Connect- Inicializa conexão com um socket int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); struct sockaddr { unsigned short sa_family; // tipo de endereço, AF_xxx char sa_data[14]; // 14 bytes do endereço de protocolo }; struct sockaddr_in { short int sin_family; // tipo de endereço unsigned short int sin_port; //Número da porta struct in_addr sin_addr; //Endereço de Internet unsigned char sin_zero[8]; //Mesmo tamanho de struct sockaddr }; struct in_addr { unsigned long s_addr; };
PROGRAMA TÍPICO Connect- Inicializa conexão com um socket int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); int socketid; socketid = socket(af_inet, SOCK_STREAM, 0); //Criando o socket struct sockaddr_in endereco; //Struct de endereco endereco.sin_family = AF_INET; //tipo do protocolo endereco.sin_port = htons(4325); //porta endereco.sin_addr.s_addr = inet_addr("127.0.0.1"); //o endereco do servidor bzero( &( endereco.sin_zero ), 8); //inserir zeros int r = connect (socketid, (struct sockaddr *)&endereco, sizeof(struct sockaddr)); if (r == -1 ) { perror("error connect()\n"); exit(1); }
PROGRAMA TÍPICO Send e Recv Envia e recebe mensagens (TCP) ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags); char caracter = 'A'; //Enviando um A para o servidor if (send (socketid, &caracter, sizeof(caracter), 0) == -1 ) { perror ("Error send\n"); exit(1); } int byteslidos; if (byteslidos = recv (socketid, &caracter, 1, 0) == -1) { perror("error recv\n"); exit(1); }
PROGRAMA TÍPICO SendTo e RecvFrom Envia e recebe mensagens (UDP) ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
PROGRAMA TÍPICO Close Fecha a conexão int close(int socketfd); int shutdown(int socketfd, int how); How: 0 Fecha a conexão para receber mensagens 1 Fecha conexão para envio de mensagens 2 Fecha a conexão para ambos os lados similar o close()
Gustavo Bezerra Paz Leitão