Exemplo de Cliente e Servidor Usando Socket no Linux!
Publicado por Diego 26/07/2008
[ Hits: 27.168 ]
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
Robo HTTP usando socket e código multiplataforma
Connect - um simples programa para atravessar proxys Socks
Fscrypt: protegendo arquivos do seu usuário sem a lentidão padrão de criptograr o disco
Faça suas próprias atualizações de pacotes/programas no Void Linux e torne-se um Contribuidor
Como rodar o Folding@home no Linux
Criando um painel de controle (Dashboard) para seu servidor com o Homepage
O Abismo entre o Código e o Chão: Saltos Tecnológicos e a Exclusão Estrutural no Brasil
Pisando no acelerador do Linux Mint: Kernel XanMod, zRAM e Ajustes de Swap
Como compilar kernel no Linux Mint
Lançamento do Brutal DOOM test 6
Consertando o erro no Brave de webgl
Solução para ter de volta as bordas e barra de títulos das janelas em zenity no Debian 13.x
Abrir um arquivo URL pelo Clipper (8)
Seno, Coseno, Tangente em CLIPPER (1)
Inserir uma URL num arquvo pelo Ubuntu (CLIPPER) (0)
VMWare Player não conecta na rede nem consigo intercambiar arquivos (1)









