• Sábado 9 de Noviembre de 2024, 03:42

Autor Tema:  problema con servidor chat en c y sockets  (Leído 1346 veces)

Perrin_1

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
problema con servidor chat en c y sockets
« en: Sábado 30 de Octubre de 2010, 18:22 »
0
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 %dn",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,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 == 0)
                continue;
            write(client_sockfd, &msj, 1);
            close(client_sockfd);
        }
        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

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: problema con servidor chat en c y sockets
« Respuesta #1 en: Viernes 5 de Noviembre de 2010, 04:51 »
0
Buenas.

Para empesar, trata de usar etiquetas de codigo, asi es mas facil leer. En la lista deplegable que dice "Code" elegi "C" y pone el codigo entre las etiquetas que se agregan.

Hay varios errores en el codigo.

las 3 variables que usar como buffers: nickname, msg e in, las declaras como char*, pero en ningun momento reservas memorias para guardar datos.
Tendrias que hacer un malloc para cada una, odeclararla como vectores: nickname[20], msg[50], in[50] por ejemplo.

scanf("%s",&nickname);

al darle el formato "%s" a la cadena, la funcion espera un char*, pero le estas pasando un char**. el compilador te tendria que dar un warning en esa linea.
lo correcto es: scanf("%s",nickname);

el tercer parametro de las funciones write y read e la longitud del buffer. En el caso de read, el tamaño maximo, y en el caso de write la cantidad de datos a mandar.
por ejemplo

char buff[40];
read(fdSock, buff, 40);

write(fdSock, "holan", 5);

en cuanto a la funcion, deberias hacer algo como:

Código: C
  1.  
  2. void *writetoserver(void *arg)
  3. {
  4.   char msg[50];
  5.  
  6.   do
  7.   {
  8.     memset((char*)msg, '', 50);
  9.     printf("Escribe tu mensaje");
  10.     fgets(msg, 49, stdin);
  11.     write(sockfd, msg, strlen(msg) + 1);
  12.   }while(strcmp(msg,"exit")!= 0)
  13. }
  14.  
  15.  

y algo similar para el read.

ademas fijate que estar creando dos veces el mismo hilo. y te falta el #include <pthread.h>


igualmente, si estas escribiendo un mensaje y llega un mensaje del server, se van a mesclar en la pantalla.

Saludos
The sweet smell of a great sorrow lies over the land.