Você está na página 1de 22

Programao com Sockets TCP e UDP Cliente

Gustavo Leito
5/24/2010

5/24/2010

INTRODUO

Objetivo da Aula

5/24/2010

OBJETIVO DA AULA

Apresentar ao aluno conceitos e prtica em sockets

5/24/2010

INTRODUO

O que um socket?

5/24/2010

INTRODUO
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 aplicao e a de transporte dentro de uma mquina.

5/24/2010

INTRODUO
Caractersticas

Uma das primeiras formas de programao distribuda (programas podem ser executados em uma ou diversas mquinas)

Baseado no modelo de comunicao Cliente/Servidor

Utiliza um protocolo de transporte (UDP, TCP)

5/24/2010

ARQUITETURA DE REDE

Socket Aplicao
(FTP, HTTP, SMTP)

Aplicao
(FTP, HTTP, SMTP)

Transporte
(TCP e UDP)

Transporte
(TCP e UDP)

Rede
(IP)

Rede
(IP)

Enlace
(Ethernet)

Enlace
(Ethernet)

5/24/2010

TIPOS DE SOCKETES
TCP x UDP

TCP
Orientado a Conexo Controle de Erro Garante Entrega Entrega Ordenada

UDP
x
No necessita de conexo No Possui controle de erro Mais simples e rpido

5/24/2010

TIPOS DE SOCKETS

5/24/2010

BYTE ORDER

Alguns computadores armazenam os nmeros em Big-Endian, ou seja, o Byte mais significativo primeiro
Ex: O nmero de dois bytes em hexadecimal representado por 4b5f ser armazenado na seguinte ordem: 4b 5f

Porm outros computadores (x86, Intel, Motorola, etc) armazenam seus dados em Little-Endian, ou seja, o byte menos significativo primeiro
Ex: O nmero 4b5f seria armazenado na seguinte ordem: 5f 4b

5/24/2010

BYTE ORDER

Big-Endian tambm chamado de Network Byte Order, por que a forma como os dados devem ser transmitidos em rede.

Seu computador, porm armazena nmeros em Host Byte Order (LittleEndian)

5/24/2010

BYTE ORDER

Para resolver esse problema temos as seguinte funes:

htons() host to network short htonl() host to network long ntohs() network to host short ntohl() network to host long

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 TPICO
Servidor
socket(); bind(); listning(); accept(); Aguardando Conexo receiv(); send(); close(); connect(); send(); receiv(); close(); socket();

Cliente

5/24/2010

PROGRAMA TPICO

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 ) ; }

Domnios: AF_UNIX, AF_LOCAL - Comunicao Local AF_INET - IPv4 AF_INET6 IPv6

Tipos: SOCK_STREAM - TCP SOCK_DGRAM - UDP

5/24/2010

EXEMPLO 1

5/24/2010

PROGRAMA TPICO

Connect- Inicializa conexo com um socket


int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
struct sockaddr { unsigned short sa_family; // tipo de endereo, AF_xxx char sa_data[14]; // 14 bytes do endereo de protocolo }; struct sockaddr_in { short int sin_family; // tipo de endereo unsigned short int sin_port; //Nmero da porta struct in_addr sin_addr; //Endereo de Internet unsigned char sin_zero[8]; //Mesmo tamanho de struct sockaddr };

struct in_addr { unsigned long s_addr; };

5/24/2010

PROGRAMA TPICO

Connect- Inicializa conexo 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); }

5/24/2010

PROGRAMA TPICO

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); }

5/24/2010

PROGRAMA TPICO

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 TPICO

Close Fecha a conexo


int close(int socketfd); int shutdown(int socketfd, int how);
How: 0 Fecha a conexo para receber mensagens 1 Fecha conexo para envio de mensagens 2 Fecha a conexo para ambos os lados similar o close()

Gustavo Bezerra Paz Leito


5/24/2010

Você também pode gostar