Erro ao compilar thread. [RESOLVIDO]

1. Erro ao compilar thread. [RESOLVIDO]

Frederick Honorio e Silva
FredySilva

(usa Ubuntu)

Enviado em 24/03/2013 - 20:57h

boa noite a todos.

Estou com problema para compilar um aplicativo de chat cliente e servidor usando threads. Onde tanto o servidor como o cliente podem enviar variar mensagens seguidas, sem ser ping pong onde um manda e o outro tem que responder. Usei o terminal do ubuntu e executei os dois arquivos tanto cliente como servidor.
A mensagem de erro e esta:

Erro no recebimento de dados: Socket operation on non-socket

o código ta assim:

servidor.c

#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

#define PORTA 8888
#define MAXBUF 256
#define MAXCONECT 5

int esock,nsock, test;
struct sockaddr_in server;
struct sockaddr_in client;
char mensagem[MAXBUF];
char resposta[MAXBUF];
int recebidos,enviados;

void* enviar (void* arg){

while(1){

gets(mensagem);

if(send(esock,mensagem,sizeof(mensagem),0)<0){
perror("Erro no envio de dados");
exit(1);
}
}
}

void* receber (void* arg){

while(1){
if(recv(esock,resposta,sizeof(resposta),0)<0){
perror("Erro no recebimento de dados");
exit(1);
}
printf("\nOutro: %s\n", resposta);
fflush(stdout);
}

}


int main(){

pthread_t thread1,thread2;
int esock,nsock, test;
struct sockaddr_in server;
struct sockaddr_in client;
int tam;


/* cria o socket */
if ( (esock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
perror("Erro na criacao do socket no servidor");
exit(1);
}

/* inicializa a estrutura endereco/porta */
server.sin_family = AF_INET;
server.sin_port = htons(PORTA);
server.sin_addr.s_addr = INADDR_ANY;
bzero(&(server.sin_zero), 8);

/* associa um número de porta ao socket */
if(bind(esock, (struct sockaddr*)&server, sizeof(struct sockaddr))<0){
perror("Erro na associacao do socket (Bind)");
exit(1);
}

/* coloca o socket em modo "listening"*/
test = listen(esock, MAXCONECT);
if (test < 0){
perror("\nErro na funcao listen.");
exit(1);
}

printf("Aguardando cliente...\n");

while (1){
tam= sizeof(struct sockaddr_in);
nsock = accept(esock,(struct sockaddr *)&client,&tam);
if(nsock <0){
perror("Erro no accept");
continue;
}

printf("Cliente conectado em %s\n", inet_ntoa(client.sin_addr));

pthread_create (&thread1, NULL, &enviar, NULL);

pthread_create (&thread2, NULL, &receber, NULL);

pthread_join(thread1,NULL);
pthread_join(thread2,NULL);

/*do
{
recebidos = recv(nsock,resposta,256,0);
resposta[recebidos] = '{TEXTO}';
printf("Cliente: %s\n",resposta);

printf("Servidor: ");
fgets(mensagem,256,stdin);
mensagem[strlen(mensagem)-1] = '{TEXTO}';
enviados = send(nsock,mensagem,strlen(mensagem),0);

}while(recebidos != -1 && enviados != -1);


if(recv(nsock,resposta,sizeof(resposta),0)<0){
perror("Erro no recebimento de dados");
exit(1);
}


/* envia uma mensagem
if(send(nsock, mensagem, strlen(mensagem),0)<0){
perror("Erro no envio de dados");
exit(1);
}*/
close(nsock);
close(esock);
}
return 0;

}





cliente.c

#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

#define PORTA 8888

int e_socket, conexao;
struct sockaddr_in destino;
char mensagem[256];
char resposta[256];

void* enviar (void* arg){

while(1){

gets(mensagem);

if(send(e_socket,mensagem,sizeof(mensagem),0)<0){
perror("Erro no envio de dados");
exit(1);
}
}
}

void* receber (void* arg){

while(1){
if(recv(e_socket,resposta,sizeof(resposta),0)<0){
perror("Erro no recebimento de dados");
exit(1);
}
printf("\nOutro: %s\n", resposta);
fflush(stdout);
}

}


int main(){

pthread_t thread1,thread2;
int e_socket, conexao;
struct sockaddr_in destino;
char mensagem[256];
char resposta[256];
int recebidos,enviados;

e_socket=socket(AF_INET,SOCK_STREAM,0);
if (e_socket < 0){
perror("Erro na criacao do socket");
exit(1);
}
destino.sin_family=AF_INET;
destino.sin_port= htons(PORTA);
destino.sin_addr.s_addr=inet_addr("192.168.0.101");
bzero(&(destino.sin_zero),8);
conexao=connect(e_socket,(struct sockaddr *)&destino,sizeof(destino));
if (conexao < 0){
perror("Erro no estabelecimento de conexao");
exit(1);
}

pthread_create (&thread1, NULL, &enviar, NULL);

pthread_create (&thread2, NULL, &receber, NULL);

pthread_join(thread1,NULL);
pthread_join(thread2,NULL);

/*do
{

printf("Cliente: ");
fgets(mensagem,256,stdin);
mensagem[strlen(mensagem)-1] = '{TEXTO}';
enviados = send(e_socket,mensagem,strlen(mensagem),0);



recebidos = recv(e_socket,resposta,256,0);
resposta[recebidos] = '{TEXTO}';
printf("Servidor: %s\n",resposta);

}while(recebidos != -1 && enviados != -1);

if(send(e_socket,mensagem,sizeof(mensagem),0)<0){
perror("Erro no envio de dados");
exit(1);
}



if(recv(e_socket,resposta,sizeof(resposta),0)<0){
perror("Erro no recebimento de dados");
exit(1);
}*/

close(e_socket);

}


Desde ja, muito obrigado!!!!


  


2. Re: Erro ao compilar thread. [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/03/2013 - 19:12h

As declarações de esock, nsock e outras variáveis dentro do corpo de main() ocultam as variáveis globais com mesmo nome. Só que as funções de recebimento e envio de dados usam as versões globais dessas variáveis, de modo que estão tentando operar com um descritor que seguramente não foi associado ao socket.


3. Re: Erro ao compilar thread. [RESOLVIDO]

Frederick Honorio e Silva
Fredysilva

(usa Ubuntu)

Enviado em 26/03/2013 - 05:34h

Então devo mudar o nome das variáveis de envio e recebimento para que a thread funcione ?


4. Re: Erro ao compilar thread. [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/03/2013 - 11:02h

Não. Você não deve redeclarar localmente as variáveis globais.


5. Re: Erro ao compilar thread. [RESOLVIDO]

Frederick Honorio e Silva
FredySilva

(usa Ubuntu)

Enviado em 26/03/2013 - 20:07h

Muito obrigado, Paulo pela dica, funcionou!!!!
Fui conferindo o código e mudei as variáveis como você me falou.

Obrigado






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts