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

problema con servidor chat en c y sockets

Estas en el tema de problema con servidor chat en c y sockets en el foro de C/C++ en Foros del Web. Que tal a todos, estoy haciendo un servidor chat basico, que este por medio de threads, pueda manejar n cantidad de clientes que se conecten ...
  #1 (permalink)  
Antiguo 30/10/2010, 10:15
 
Fecha de Ingreso: marzo-2009
Mensajes: 163
Antigüedad: 15 años, 1 mes
Puntos: 0
problema con servidor chat en c y sockets

Que tal a todos, estoy haciendo un servidor chat basico, que este por medio de threads, pueda manejar n cantidad de clientes que se conecten a el, donde una vez que se conecten cada cliente debe de ingresar un nickname y comenzar a escribir, se sale del chat hasta que el usuario escribe exit, y el servidor debe de hacer que todos los clientes vean los mensajes que escriben.

El problema que se me presenta es el cliente, tengo todo desarrollado donde por hilos lee y escribe en el socket el mensaje pero con la funcion que tengo no logra llegar hasta esa fase, nose si alguien puede ayudarme este es el codigo de mi cliente

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);
		}
	}
}

server
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;
    }
LA PARTE QUE NO SE EJECUTA ES LA DE WRITEONSERVER, PORQUE nunca me pide que escriba el mensaje y no entiendo porque espero que me puedan ayudar

saudos

Etiquetas: chat, sockets, servidores
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 14:43.