Exemplo de Cliente e Servidor Usando Socket no Linux!
Publicado por Diego 26/07/2008
[ Hits: 26.875 ]
Homepage: destrook.sytes.net
Download Cliente e servidor.txt
Um exemplo de cliente e servidor usando socket no Linux usando a linguagem C.
/* 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
Calcular Broadcast e IPs disponíveis
Simples servidor http com concorrência feito em C
Connect - um simples programa para atravessar proxys Socks
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)