Exemplo de Cliente e Servidor Usando Socket no Linux!
Publicado por Diego 26/07/2008
[ Hits: 26.993 ]
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
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (0)
estou na 22.1 e não é atualizado pra 22.4 via "sudo full-upgrade&... (6)
É normal não gostar de KDE? (6)









