Exemplo de Cliente e Servidor Usando Socket no Linux!

Publicado por Diego 26/07/2008

[ Hits: 26.697 ]

Homepage: destrook.sytes.net

Download Cliente e servidor.txt




Um exemplo de cliente e servidor usando socket no Linux usando a linguagem C.

  



Esconder código-fonte

/* Cliente */ 

/* Arquivo: cl.c */

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

/*#define ip "127.0.0.1"*/
#define tmb 1024
#define porta 6666
main ()
{

    char ip[16], buffer[tmb], bufaux[tmb], *loc;
    char comandos[]="/x /mem /disc /time /pros /port /help";
    int tbuf, skt, escolha;
    struct sockaddr_in serv;
    
    system("clear");
    
    printf("\n    xXxXxX Client CtrlxAltxDel XxXxXx\n\n");
    
    printf("\n>> Diegite o ip do Servidor ou /x para sair: ");
    gets(ip);
    
    skt = socket(AF_INET, SOCK_STREAM, 0);
    
    serv.sin_family = AF_INET; 
    serv.sin_addr.s_addr = inet_addr(ip); 
    serv.sin_port = htons (porta); 

    memset (&(serv.sin_zero), 0x00, sizeof (serv.sin_zero));
    if(connect (skt, (struct sockaddr *)&serv, sizeof (struct sockaddr)) != 0) 
    {
   puts("\n> Servidor nao Encontrado\n");
   exit(0);
    
    }
    printf(">> A Conexao com o Servidor %s foi estabelecida na porta %d \n\n",ip,porta);
    // Recebe ack do serv
    tbuf = recv (skt, buffer, tmb, 0);
    buffer[tbuf] = 0x00;
    printf (">: %s\n",buffer);

    // Envia ack p/ serv
    strcpy(buffer, "Client comunicando OK!!!");
    send(skt, buffer, strlen(buffer), 0 );    
    
    
    while(strcmp(buffer,"/x") != 0){
   printf("> ");
   gets(buffer);
   strcpy(bufaux,buffer);
   while(strncmp(buffer,"/",1) == 0) 
       if ((strcmp(buffer,"/mem") != 0) && (strcmp(buffer,"/disc") != 0) 
       && (strcmp(buffer,"/time") != 0) && (strcmp(buffer,"/pros") != 0) 
       && (strcmp(buffer,"/port") != 0) && (strcmp(buffer,"/help") != 0) 
       && (strcmp(buffer,"/x") != 0)){
      puts("> Comando invalido ");
      printf("> ");
      gets(buffer);
       }
       else break;    
            
            send(skt, buffer, strlen(buffer), 0);
       
       if ((strncmp(buffer,"/",1) == 0) && (strcmp(buffer,"/x") != 0)){
       
       tbuf = recv(skt, buffer, tmb, 0);
       buffer[tbuf] = 0x00;
       loc = strstr(comandos,bufaux);
       escolha = loc - comandos;
       
       switch (escolha){
      case 3: printf ("\n>: Memoria Disponivel:\n\n %s\n",buffer);break;
      case 8: printf ("\n>: Partiçoes de Disco:\n\n %s\n",buffer);break;
      case 14: printf ("\n>: Tempo Total logado:\n\n %s\n",buffer);break;
      case 20: printf ("\n>: Processo Rodando no Servidor:\n\n %s\n",buffer);break;
           case 26: printf ("\n>: Portas Abertas no Servidor:\n\n %s\n",buffer);break;
           case 32: printf ("\n\n %s\n",buffer);break;
           
           }        
   }
    } 
    
    close(skt);
    printf (">>A conexao com o servidor foi finalizada!!!\n\n");
    exit(0);    
}

/* xXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX */

/* Servidor */

/* Arquivo: se.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <fcntl.h>
#define porta 6666
#define tmb 1024

char buffer[tmb], bufaux[tmb], *loc;
char comandos[] = "/x /mem /disc /time /pros /port /help";
int pontarq, tbuf, skt, tskt, escolha;
struct sockaddr_in serv;

main(){
    
    system("clear");
    
    skt = socket(AF_INET, SOCK_STREAM, 0);

    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr = INADDR_ANY;
    serv.sin_port = htons (porta);
    memset(&(serv.sin_zero),0x00,sizeof(serv.sin_zero));
    tskt = sizeof(struct sockaddr_in);
    
    printf("\n    xXxXxX Server CtrlxAltxDel XxXxXx\n\n");
    bind(skt,(struct sockaddr *)&serv,sizeof(struct sockaddr));
    listen(skt,1);
    printf(">> Servidor esta escutando na porta %d\n\n",porta);
    
    
    skt = accept(skt,(struct sockaddr *)&serv,&tskt);
    printf(">> A Conexao com o endereco %s foi estabelecida\n\n",inet_ntoa(serv.sin_addr));

    
    // Envia ack p/ cli
    strcpy(buffer,"Servidor Comunicando OK!!!");
    strcpy(bufaux,buffer);
    send(skt,buffer,strlen(buffer), 0);

    // Recebe ack do cli
    tbuf = recv(skt, buffer,tmb, 0);
    buffer[tbuf]=0x00;
    printf(">: %s\n",buffer);
    
    
    do{
    tbuf = recv(skt,buffer,tmb,0);
    buffer[tbuf]=0x00;
    
    if (strncmp(buffer,"/",1) == 0){

        loc = strstr(comandos,buffer);
   escolha = loc - comandos;

   switch(escolha){
     case 0: break;
     
     case 3: 
      puts(">> Memoria Disponivel Requisitada");
      system("free -mot > temp");
      pontarq = open("temp",O_RDONLY,0666);
          if(pontarq < 0){
              puts("Erro no arquivo temporario!");
               }      
          tbuf = read(pontarq,buffer,sizeof(buffer));
          close(pontarq);
          send(skt,buffer,tbuf,0);
           system("rm -r temp");
          break;
                 
         case 8:
           puts(">> Partiçoes de disco Requisitadas");
      system("df -h > temp");
           pontarq = open("temp", O_RDONLY, 0666);
          if(pontarq < 0){
              puts("Erro no arquivo temporario!");
               }      
          tbuf = read(pontarq,buffer,sizeof(buffer));
          close(pontarq);
          send(skt,buffer,tbuf,0);
           system("rm -r temp");
      break;

        case 14:
          puts(">> Tempo Logado Requisitado");
          system("uptime > temp");
      pontarq = open("temp", O_RDONLY, 0666);
          if(pontarq < 0){
              puts("Erro no arquivo temporario!");
      }      
          tbuf = read(pontarq,buffer,sizeof(buffer));
          close(pontarq);
          send(skt,buffer,tbuf,0);
           system("rm -r temp");
          break;
        case 20:
          puts(">> Processos Rodando no servidor");
          system("ps -a > temp");
      pontarq = open("temp", O_RDONLY, 0666);
          if(pontarq < 0){
              puts("Erro no arquivo temporario!");
      }      
          tbuf = read(pontarq,buffer,sizeof(buffer));
          close(pontarq);
          send(skt,buffer,tbuf,0);
           system("rm -r temp");
          break;
     case 26:
          puts(">> Portas abertas no servidor");
          system("netstat -ant > temp");
      pontarq = open("temp", O_RDONLY, 0666);
          if(pontarq < 0){
              puts("Erro no arquivo temporario!");
      }      
          tbuf = read(pontarq,buffer,sizeof(buffer));
          close(pontarq);
          send(skt,buffer,tbuf,0);
           system("rm -r temp");
          break;
     case 32:
          puts(">> Help Solicitado");
          pontarq = open("help", O_RDONLY, 0666);
          if(pontarq < 0){
              puts("Erro no arquivo temporario!");
      }      
          tbuf = read(pontarq,buffer,sizeof(buffer));
          close(pontarq);
          send(skt,buffer,tbuf,0);
           break;
      
       }
    }
    else
        while(strcmp(bufaux,buffer) != 0){
       printf(">: %s\n",buffer);     
   strcpy(bufaux,buffer);
       
   }   

    }while(strcmp(buffer,"/x") != 0);
    
    close(skt); 
    printf(">> A Conexao com o host %s foi encerrada!!!\n\n",inet_ntoa(serv.sin_addr));
    exit(0);
}


/* xXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX */

/* HELP */

/* Arquivo: help */


            HELP         Ajuda ao usuário


/help                    Ajuda de comandos básicos do protocolo

/x                       Encerra a conexão entre o cliente e o servidor

/mem                     Mostra disponibilidade da memória RAM 

/disc                    Mostra as partições no HD

/port                    Mostra as portas abertas no Sistema Operacional

/time                    Mostra o tempo que o servidor está ligado

/pros                    Mostra os processos que estão executando no servidor

Scripts recomendados

Ruby

[C - Socket] UDP CLIENT

Programa em C para monitorar IPs e portas ativas

GetIP

Funções básicas para conexão OpenSSL em C


  

Comentários
[1] Comentário enviado por ricfdgomes em 09/09/2008 - 21:25h

Ois,
Ando à volta com uma cena que tou um pouco atrapalhado.
Queria fazer um programa em c para a escola que fizesse o seguinte:
Cliente-servidor que simule o funcionamento de um servidor proxy em que o proxy deverá receber pedidos dos clientes e redireccioná-los
para um determinado servidor de dados, interpondo-se entre os dois. Como funcionalidade adicional poderá ainda bloquear o acesso a determinadas fontes de dados.

Deve-se considerar os seguintes pontos:

a) desenvolver uma aplicação cliente que comunique via sockets TCP com o servidor proxy.
b) O cliente deverá enviar uma mensagem para o proxy com o comando “PING <IP destino> <Porto destino>”.
c) O proxy cria uma ligação para um servidor de dados, que simplesmente responde com o seu hostname.
d) Essa informação (hostname) é depois enviada para o cliente.
e) Em todas estas interacções, as mensagens recebidas deverão ser impressas no écran.
f) O proxy poderá ainda conter um ficheiro proibido.txt, com os endereços IP’s dos servidores a bloquear. Quando receber o pedido do cliente, valida se se encontram nesta lista e em caso afirmativo responde com “Proibido aceder a este servidor”.

Será que me podia ajudar?

[2] Comentário enviado por mariz em 17/07/2010 - 13:50h

Grande, você esta de parabéns pelo exemplo. Este seu exemplo me ajudou muito a entender um pouco de sockets em C, pois, todos os outros exemplos que tinha tentando estudar não rodavam. Obrigado por contribui com o nosso aprendizado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts