Exemplo de Cliente e Servidor Usando Socket no Linux!
Publicado por Diego 26/07/2008
[ Hits: 27.043 ]
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
Exemplo Básico de Sockets em C
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Instalando partes faltantes do Plasma 6
Adicionar botão "mostrar área de trabalho" no Zorin OS
Como montar um servidor de backup no linux
Estou tentando ser legalista, mas tá complicado! (9)
espelhar monitores nao funciona (2)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (1)









