cristiano_sa
(usa Fedora)
Enviado em 01/06/2014 - 16:57h
Olá.
Sou um pouco novo em linux e preciso criar um programa utilizando socket para que um cliente e um servidor se comuniquem através de uma mensagem e assim finalize o programa.
Abaixo o código que fui montando, peguei algumas partes aqui no Viva o Linux porém ele não está copilando.
O servidor até consegui fazer copilar, mas o cliente não.
Se puderem me ajudar fico grato.
##########
#Servidor#
##########
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <netdb.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int meu_socket;
int sock_cliente;
struct sockaddr_in addr;
meu_socket = socket(AF_INET,SOCK_STREAM,0);
if(meu_socket == -1)
{
printf("Erro ao criar o socket!\n");
return 1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(5555);
addr.sin_addr.s_addr = INADDR_ANY;
memset(&addr.sin_zero,0,sizeof(addr.sin_zero));
if(bind(meu_socket,(struct sockaddr*)&addr,sizeof(addr)) == -1)
{
printf("Erro na funcao bind()\n");
return 1;
}
if(listen(meu_socket,1) == -1)
{
printf("Erro na funcao listen()\n");
return 1;
}
printf("Aguardando cliente...\n");
sock_cliente = accept(meu_socket,0,0);
if(sock_cliente == -1)
{
printf("Erro na funcao accept()\n");
return 1;
}
printf("Cliente conectado!\n\n");
int recebidos, enviados; /* Controle de bytes enviados e recebidos */
char mensagem[256]; /* Buffer para envio de mensagens */
char resposta[256]; /* Buffer para receber mensagens */
do /* Executa as instruções abaixo ... */
{
recebidos = recv(sock_cliente,resposta,256,0); /* Recebe mensagem do cliente */
resposta[recebidos] = '{TEXTO}'; /* Finaliza a string com o caractere NULO */
printf("Cliente: %s\n",resposta); /* Mostra a mensagem do cliente */
printf("Servidor: "); /* Simplesmente informa que deve-se preencher uma mensagem */
fgets(mensagem,256,stdin); /* Obtém uma mensagem digitada */
mensagem[strlen(mensagem)-1] = '{TEXTO}'; /* Finaliza a string */
enviados = send(sock_cliente,mensagem,strlen(mensagem),0); /* Envia a string */
}while(recebidos != -1 && enviados != -1); /* ... enquanto as funções send() e recv() não retornarem -1 = ERRO */
close(sock_cliente);
close(meu_socket);
return 0;
}
#########
#Cliente#
#########
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
int main()
{
int meu_socket;
struct sockaddr_in addr;
meu_socket = socket(AF_INET,SOCK_STREAM,0);
if(meu_socket == -1)
{
printf("Erro ao criar o socket!\n");
return 1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(5555);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(&addr.sin_zero,0,sizeof(addr.sin_zero));
printf("Tentando se conectar ao servidor...\n");
if(connect(meu_socket,(struct sockaddr*)&addr,sizeof(addr)) == -1)
{
printf("Erro ao se conectar!\n");
return 1;
}
printf("Conectado!\n\n");
int recebidos, enviados;
char mensagem[256];
char resposta[256];
do
{
/* O processo inverso é feito aqui. Como o servidor espera uma mensagem inicialmente, o cliente deverá fornecê-la */
printf("Cliente: ");
fgets(mensagem,256,stdin);
mensagem[strlen(mensagem)-1] = '{TEXTO}';
enviados = send(meu_socket,mensagem,strlen(mensagem),0);
/* Após enviar a mensagem, espera-se a resposta do servidor */
recebidos = recv(meu_socket,resposta,256,0);
resposta[recebidos] = '{TEXTO}';
printf("Servidor: %s\n",resposta);
}while(recebidos != -1 && enviados != -1);
close(meu_socket);
return 0;
}