Gustavo Leitão Programação com Sockets TCP e UDP - Cliente 5/24/2010
Gustavo Leitão
Programação com Sockets TCP e UDP - Cliente
5/24/2010
5/24/2010
INTRODUÇÃO
Objetivo da Aula
5/24/2010
OBJETIVO DA AULA
Apresentar ao aluno conceitos e prática em sockets
5/24/2010
INTRODUÇÃO
O que é um socket?
5/24/2010
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”.
5/24/2010
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)
5/24/2010
ARQUITETURA DE REDE
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)
Socket
5/24/2010
TIPOS DE SOCKETES
TCP x UDP
TCP
• Orientado a Conexão
• Controle de Erro
• Garante Entrega
• Entrega Ordenada
UDP
• Não necessita de conexão
• Não Possui controle de erro
• Mais simples e rápido
x
5/24/2010
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
5/24/2010
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)
5/24/2010
BYTE ORDER
htons() host to network short htonl() host to network long ntohs() network to host short ntohl() network to host long
Para resolver esse problema temos as seguinte funções:
5/24/2010
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)
5/24/2010
PROGRAMA TÍPICO
close();
send();
receiv();
“Aguardando Conexão”
accept();
listning();
bind();
socket();
Servidor
close();
receiv();
send();
connect();
socket();
Cliente
5/24/2010
PROGRAMA TÍPICO
#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 ) ;
}
Socket - Acesso ao Descritor de Arquivo!
Domínios: AF_UNIX, AF_LOCAL - Comunicação Local AF_INET - IPv4 AF_INET6 IPv6
int socket(int domain, int type, int protocol);
Tipos: SOCK_STREAM - TCP SOCK_DGRAM - UDP
5/24/2010
EXEMPLO 1
5/24/2010
PROGRAMA TÍPICO
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;
};
Connect- Inicializa conexão com um socket
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
5/24/2010
PROGRAMA TÍPICO
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);
}
Connect- Inicializa conexão com um socket
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
5/24/2010
PROGRAMA TÍPICO
char caracter = 'A';
//Enviando um A para o servidor
if (send (socketId, &caracter, sizeof(caracter), 0) == -1 ) {
perror ("Error send\n");
exit(1);
}
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);
int bytesLidos;
if (bytesLidos = recv (socketId, &caracter, 1, 0) == -1) {
perror("Error recv\n");
exit(1);
}
5/24/2010
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);
5/24/2010
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
5/24/2010