Exemplo de Cliente e Servidor Usando Socket no Linux!
Publicado por Diego 26/07/2008
[ Hits: 26.677 ]
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
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
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
É cada coisa que me aparece! - não é só 3% (3)
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta