sábado, 23 de abril de 2011

Sockets em C - Server

Olá pessoal,

vamos ver um pequeno exemplo de servidor TCP. No exemplo de hoje  vamos construir um servidor, que na verdade não tem muita utilidade, vamos apenas mostrar na tela o IP do cliente que se conectou e a porta que ele utilizou para se conectar. Lembre-se, essa porta não é a porta que o servidor está escutando, e sim a porta, TCP, que o cliente utilizou para se conectar.

Ferramentas utilizadas:

Compilador: gcc,  versão 4.4.5 (para saber a versão do gcc usamos o comando gcc -v)
Sistema Operacional: Linux debian 2.6.26-2-amd64 (para saber a versão do sistema usamos o comando
uname -a)

Segue abaixo o código de nosso servidor:


#include <sys/socket.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>

void main(int argc, char ** argv)
{
 int listenfd, connfd, porta; //descitores de conexao e varialvel porta que ira armazenar a porta do cliente
 struct sockaddr_in servaddr, cliaddr; //estruturas sockadd_in para armazenar os dados do server e do cliente
 socklen_t len; //variavel para armazenar o tamanho da estrutura do cliente
 char  buff[4096];//vai armazenar informacoes sobre o cliente
 listenfd = socket(AF_INET, SOCK_STREAM,0);
 memset(&servaddr,0,sizeof(servaddr));
 servaddr.sin_family = AF_INET;
 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
 servaddr.sin_port = htons(4001);

bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(listenfd,10); 

 for(;;)
 {  
 
  len = sizeof(cliaddr);
  connfd = accept(listenfd, (struct sockaddr *)&cliaddr,&len);//vamos aceitar o cliente
  inet_ntop(AF_INET, &(cliaddr.sin_addr), buff, sizeof(buff));//vamos transformar o endereco no formato xxx.xxx.xxx.xxx e armazernar em buff
  porta = ntohs(cliaddr.sin_port);//vamos identificar a porta que o cliente usou para se conectar
  printf("Cliente: %s,  porta: %d \n", buff, porta);
  close(connfd); 

 } 
}
você pode colocar esta código no vi, salvar como serv.c e digitar o seguinte comando:
gcc serv.c -o server
vamos rodar:
./server
Quando um cliente se conectar teremos a seguinte mensagem:
Cliente: 10.1.1.2, porta: 8001
Pessoal, espero ter ajudado com essa breve introduções a sockets em sistemas linux.