Servidor TCP/IP em C

Publicado por Samuel Leonardo 27/07/2009

[ Hits: 14.504 ]

Homepage: localhost

Download tcp_server.c




Exemplo de um servidor TCP/IP usando sockets. Esse é o primeiro script que faço que não é um jogo :P, mas tá valendo.

NOTA: Também postei um cliente para esse servidor, verifique na lista de scripts enviados por mim através do meu perfil.

Para compilar:

$ gcc -o server tcp_server.c

Para executar:

$ ./server <num_da_porta>

Valeu!

  



Esconder código-fonte

/*
   Exemplo de um servidor TCP/IP usando sockets.
   Esse é o primeiro scripts que faço que não é um jogo :P,
   mas tá valendo. 
   NOTE: Vô postar hoje um cliente para esse server.
   para compilar:
   $ gcc -o sever tcp_server.c
   para executar:
   $ ./server <num_da_porta>
   valeu!
   
   NOTE: ORGANIZEI TODO O CÓDIGO, DE FORMA QUE FIQUE MAIS LEGÍVEL A LÓGICA DO MESMO.
         ISSO É O QUE ACONTECE QUANDO SE USA A TECLA TAB. /:^]
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
#include <sys/types.h>
#include <sys/socket.h>
//funções inet_*()
#include <arpa/inet.h>
//struct sockaddr_in, ntol e outras
#include <netinet/in.h>

#include <errno.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
   int sockfd, new_sockfd;
   int bytes;
   socklen_t length;//para accept() e bind()
   char buffer[32], quit;
   struct sockaddr_in server;
   struct sockaddr_in client;
   
   sockfd = socket(AF_INET, SOCK_STREAM, 0);
   if(sockfd < 0)
   {
      perror("server_sockfd:::");
      exit(1);
   }
   
   if(argc == 2)
   {
      server.sin_family  =  AF_INET;
      //é meio arriscado usar atoi() aqui,
      //mas assim fica fácil escolher em que porta esperar por conexões
      server.sin_port    =  htons(atoi(argv[1]));
      server.sin_addr.s_addr = INADDR_ANY;
      memset(&(server.sin_zero), 0x00, 8);
   }
   else
   {
      printf("\n\tusage: %s <num_porta> \n\n", argv[0]);
      close(sockfd);
      exit(1);
   }
   
   length = sizeof(struct sockaddr);
   if(bind(sockfd, (struct sockaddr *)&server, length) < 0)
   {
      perror("server_bind:::");
      close(sockfd);
      exit(1);
   }
   
   //o servidor aceitará no máximo apenas duas conexões
   if(listen(sockfd, 2) < 0)
   {
      perror("server_listen:::");
      close(sockfd);
      exit(1);
   }
   
   printf("\nAguardando por conexões na porta %s...\n\n", argv[1]);
   
   //aguardando por conexões
   new_sockfd = accept(sockfd, (struct sockaddr *)&client, &length);
   if(new_sockfd < 0)
   {
      perror("server_accept:::");
      close(sockfd);
      exit(1);
   }

   printf("\nAceitando conexão de %s\n\n", inet_ntoa(client.sin_addr));
   
   quit = 'N';
   while(quit != 'S')
   {
      bytes = send(new_sockfd, "SERVER:::ok!", 12, 0);
      //ocorreu um erro = -1
      if(bytes < 0)
      {
         perror("server_send:::");
         close(new_sockfd);
         close(sockfd);
         exit(1);
      }
      
      bytes = recv(new_sockfd, buffer, 32, 0);
      //NOTE:ocorreu um erro = -1 ou cliente fechou conexão = 0
      if(bytes <= 0)
      {
         perror("server_recv:::");
         close(new_sockfd);
         close(sockfd);
         exit(1);
      }
      
      buffer[bytes] = 0x00;//0x00 o mesmo que '{FONTE}'
      quit = buffer[0];
      printf("\nRECEBIDO:::%s\n\n", buffer);
   }
   
   close(new_sockfd);
   close(sockfd);
   
   return 0;
}

Scripts recomendados

Calcular Broadcast e IPs disponíveis

Descritor de protocolo

Fractal

Programa em C para monitorar IPs e portas ativas

Script de smbstatus


  

Comentários
[1] Comentário enviado por SamL em 28/07/2009 - 02:18h

"NOTA: Também postei um cliente para esse servidor, verifique na lista de scripts enviados por mim através do meu perfil."
Ficou até melhor do que eu tinha escrito, obrigado à quem refez essa nota.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts