Anda di halaman 1dari 17

Programação com Sockets TCP e UDP -

Servidor
Gustavo Leitão

5/28/2010
5/28/2010

INTRODUÇÃO

Objetivo da Aula
5/28/2010

OBJETIVO DA AULA

Apresentar ao aluno
conceitos e prática em
sockets para a
programação de
servidores
5/28/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/28/2010

PROGRAMA TÍPICO

Servidor Cliente
socket();

bind(); socket();

listning();

accept();

“Aguardando Conexão” connect();

receiv(); send();

send(); receiv();

close(); close();
5/28/2010

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: Tipos:
AF_UNIX, AF_LOCAL - Comunicação Local SOCK_STREAM - TCP
AF_INET - IPv4 SOCK_DGRAM - UDP
AF_INET6 IPv6
5/28/2010
5/28/2010

PROGRAMA TÍPICO

Bind – Em que porta estou?


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 = INADDR_ANY; //qualquer interface de rede

bzero( &( endereco.sin_zero ), 8); //inserir zeros

//Ligando o socket a uma porta do servidor

int r = bind (socketId, (struct sockaddr *)&endereco ,


sizeof(struct sockaddr))

if (r == -1) {
perror("Error bind()\n");
exit(1);
}
5/28/2010
5/28/2010

PROGRAMA TÍPICO

Listen – Escutar a porta!


int listen(int sockfd, int backlog);

//Habilitando o servidor a receber conexoes do cliente


if ( listen( socketId, 4 ) == -1) {
perror("Error listen()\n");
exit(1);
}

Backlog -> representa o tamanho da fila de requisições de clientes para serem aceitos
5/28/2010
5/28/2010

PROGRAMA TÍPICO

Accept – Aceitar conexão do cliente


int accept(int sockfd, struct sockaddr *addr,
socklen_t *addrlen);

//Endereço de uma conexão cliente


struct sockaddr_in enderecoCliente;

//Tamanho do endereço do cliente


socklen_t enderecoClienteTam;

printf("Servidor: esperando conexões clientes\n");

//Fica bloqueado esperando uma conexão do cliente


int conexaoClienteId = accept(socketId,
(struct sockaddr *) &enderecoCliente,
&enderecoClienteTam );

printf("Servidor: recebeu conexão de %s\n",


inet_ntoa(enderecoCliente.sin_addr ));
5/28/2010
5/28/2010

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);
}
5/28/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/28/2010
5/28/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()