Exemplo de Cliente e Servidor Usando Socket no Linux!
Publicado por Diego 26/07/2008
[ Hits: 26.943 ]
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
Portscan Simples Usando Sockets em C
Connect - um simples programa para atravessar proxys Socks
O que é o THP na configuração de RAM do Linux e quando desabilitá-lo
Comparação entre os escalonadores BFQ e MQ-Deadline (acesso a disco) no Arch e Debian
Conciliando o uso da ZRAM e SWAP em disco na sua máquina
Servidor de Backup com Ubuntu Server 24.04 LTS, RAID e Duplicati (Dell PowerEdge T420)
Como unir duas coleções de ROMs preservando as versões traduzidas (sem duplicatas)
Como instalar o Telegram Desktop no Ubuntu 24.04
Overclocking Permanente para Drastic no Miyoo Mini Plus
Problemas de chaves (/usr/share/keyrings) no Debian
Converter os repositórios Debian para o novo formato com as chaves
Problema com audio apos upgrade (2)
eu preciso saber uma coisa sobre os games no linux (3)
eu preciso saber uma coisa sobre os games no linux (1)