Exemplo de Cliente e Servidor Usando Socket no Linux!
Publicado por Diego 26/07/2008
[ Hits: 26.698 ]
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
Usando sockets para monitorar servidores
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Quero saber sobre os melhores aplicativos de office para usar em 2024 ... (3)
Queria saber se existe alguma forma de desistalar programa no ubuntu s... (3)
Toda vez que tento atualizar o clamav me deparo com erros ao atualizar... (0)