• Jueves 14 de Noviembre de 2024, 04:21

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Perrin_1

Páginas: [1]
1
C/C++ / problema con servidor chat en c y sockets
« en: Sábado 30 de Octubre de 2010, 18:22 »
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

Páginas: [1]