Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con cliente chat en sockets

Estas en el tema de problema con cliente chat en sockets en el foro de C/C++ en Foros del Web. Que tal a todos, tengo un problema en mi codigo, estoy generando un chat donde el cliente se conecta a un servidor, el servidor los ...
  #1 (permalink)  
Antiguo 28/10/2010, 21:37
 
Fecha de Ingreso: marzo-2009
Mensajes: 163
Antigüedad: 15 años, 8 meses
Puntos: 0
problema con cliente chat en sockets

Que tal a todos, tengo un problema en mi codigo, estoy generando un chat donde el cliente se conecta a un servidor, el servidor los maneja por medio de hilos asi puede llegar a tener mas de 1 cliente conectados a el, y cuando un cliente mande un mensaje este le llega al servidor y el servidor se lo regresa a todos los cliente, genere el siguiente codigo del cliente, me pide mi nickname pero ya no me pide lo que tengo de "Escribe tu mensaje" y no entiendo porque haber si alguien puede ayudarme

Código:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
void *writetoserver(void *arg);
void *readfromserver(void *arg);
int sockfd; 
int main()
{
	int len; 
	struct sockaddr_in address; 
	int result; 
	char* nickname;
	pthread_t wThread, rThread;
	//Pide usuario
	printf("Escribe un nickname para iniciar el nuevo Messenger: ");
	scanf("%s",&nickname);
	/* Crear un socket para el cliente */
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	/* Nombrar el socket, de acuerdo con el server */
	address.sin_family = AF_INET; 
	address.sin_addr.s_addr = inet_addr("127.0.0.1"); 
	address.sin_port = htons(9734); 
	len = sizeof(address); 
	result = connect(sockfd, (struct sockaddr *)&address, len);
	if(result == -1) 
	{ 
		perror("oops: client1"); 
		exit(1); 
	}
	
	write(sockfd, nickname, 1); 
	read(sockfd, nickname, 1); 
	/* Crea un hilo que espera a que el cliente escriba */
        pthread_create(&wThread,NULL,writetoserver,NULL);
	/* Crea un hilo que espera a que el servidor mande mensajes */
        pthread_create(&rThread,NULL,writetoserver,NULL);
	
	pthread_join(wThread,NULL);
	pthread_join(rThread,NULL);
	
	close(sockfd);

	return 0;
}

void *writetoserver(void *arg)
{
	char* msg;	
	while(strcmp(msg,"exit")!= 0)
	{
		printf("Escribe tu mensaje");
		scanf("%s",msg);
		write(sockfd, msg, 1);  
	}
}
	
void *readfromserver(void *arg)
{
	char* in;
	while(strcmp(in,"exit")!=0)
	{
		read(sockfd, in, 1);
		if(strcmp(in,"msj") == 1)
		{
			read(sockfd, in, 1);				
			printf(" %s",in);
		}
	}
}
  #2 (permalink)  
Antiguo 28/10/2010, 22:03
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: problema con cliente chat en sockets

Comprueba estas dos instrucciones:
write(sockfd, nickname, 1);
read(sockfd, nickname, 1);
mandas al server tu nickname....y luego te pones a escuchar el nickname de nuevo. eso posiblemente evita qu se creen los dos threads.....


No estoy seguro de que sea lo incorrecto. Pero te voy tirando una idea. Antes de ponerle nickname funcionaba el codigo?? si es asi, decinnos que agregaste y cuando dejo de funciones.
  #3 (permalink)  
Antiguo 28/10/2010, 22:13
 
Fecha de Ingreso: marzo-2009
Mensajes: 163
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: problema con cliente chat en sockets

LO QUE TRATO DE HACER CON EL WRITE Y READ ES QUE PRIMERO ESCRIBE EN EL SOCKET QUE ENVIA AL SERVER EL MENSAJE, ESTE LO RECIBE Y LUEGO LEE EL MENSAJE CON SU RESPECTIVO NICKNAME. y si te fijas hasta la parte de abajo en la fucion writetoserver es donde escrib,e donde se lo mando por el lpthread lo lee de los argumentos de la funcion pero no me manda llamar esa funcion, esa es mi duda =S
  #4 (permalink)  
Antiguo 30/10/2010, 07:59
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: problema con cliente chat en sockets

Es evidente que por alguna razon no llega hasta esa parte. Proba conmentando, momentaneamente lo del envio del nickname. Y veremos que pasa.

Mas no te puedo decir, porque no tengo el server para probar.
  #5 (permalink)  
Antiguo 30/10/2010, 10:09
 
Fecha de Ingreso: marzo-2009
Mensajes: 163
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: problema con cliente chat en sockets

Este es el codigo de mi server, que es el que recibe por hilos todos los cliente que se conectan, les envian el mensaje y este se supone que le regresa el mensaje pero mi cliente falla

Código:
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <stdio.h>
#include <netinet/in.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CLIENT 10
int totcltes=0;
int client_sockfd[MAX_CLIENT];
void *coneccion_clte(void *arg);
int main()
    {
    int server_sockfd;
    int server_len, client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;
    string parametro[MAX_CLIENT];
    pthread_t tid[MAX_CLIENT];
    int i;
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    server_address.sin_port = htons(9734);
    server_len = sizeof(server_address);
    bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
    /* Crear una cola de conexiones */
    listen(server_sockfd, 5);
    while(totcltes<MAX_CLIENT) //
    {
        printf("server esperando, clientes atendidos %d\n",totcltes);
        /* Aceptar conexión */
        client_sockfd[totcltes] = accept(server_sockfd,(struct sockaddr *) &client_address, &client_len);
        /*recibe el nombre del cliente*/
        read(client_sockfd[mynum], &parametro[totcltes], 1);
        /* Crea un hilo que atiende al nuevo cliente */
        pthread_create(&tid[totcltes],NULL,coneccion_clte,(void *) &parametro[totcltes]);
        totcltes++;
    }
    for(i=0;i<MAX_CLIENT;i++)
        pthread_join(tid[i],NULL);
}
    void *coneccion_clte(void *arg)
    {
        string msj;
        string *n=(string *) arg;
        int mynum=*n;
        read(client_sockfd[mynum], &msj, 1);
        msj = *n + ": " + msj;
        sleep(5);
        for(int i=0; i<totcltes;++i){
            if(client_sockfd[i] == 0)
                continue;
            write(client_sockfd[i], &msj, 1);
            close(client_sockfd[i]);
        }
        return;
    }

Etiquetas: chat, cliente, sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:57.