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.