Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: BeLGaRioN en 8 Junio 2010, 20:23 pm



Título: Programando un chat en C
Publicado por: BeLGaRioN en 8 Junio 2010, 20:23 pm
Hola. Bueno, el asunto es que estoy programando un chat en C. No tengo ningún problema a la hora de comunicar un único usuario con el servidor, pero a la hora de meter 2 usuarios ya suceden problemas. Había pensado que después de entrar el primer usuario, se crease un subproceso que siguiese escuchando por si algún otro usuario quisiera entrar y compila sin ningún problema, pero me da problemas en el bind del subproceso. Llevo algún tiempo dándole vueltas y no sé que es lo que está fallando. Si me pudiérais echar un cable sería de agradecer.

El código del main es este:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <process.h>

int main(int argc, char *argv[])
{
    /* Variables para la apertura de socket */
    SOCKET sock;
    int len=0;
    char Buffer[1024];
    /* Llamada a función abrir socket */
    abrir_socket(&sock, &len);
    /* Una vez conectada una persona, abrimos sockets dependiendo de cuantos más
    se conecten */
    _beginthread(subproceso(), 0, NULL);
    while(len!=0) //mientras estemos conectados con el otro pc
    {
          len=recv(sock,Buffer,1023,0); //recibimos los datos que envie
          if(len>0) //si seguimos conectados
          {
             Buffer[len]=0; //le ponemos el final de cadena
             printf("Texto recibido:%s",Buffer); //imprimimos la cadena recibida
          }
    }
}

La función abrir socket:
Código:
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>

void abrir_socket(SOCKET* variable1, int* variable2)
{
    /* Declaración de variables a usar */
    WSADATA wsa;
    struct sockaddr_in local;
    SOCKET sock;
    int len;
    /* Igualación de punteros */
    sock=*variable1;
    len=*variable2;
    //Inicializamos
    WSAStartup(MAKEWORD(2,0),&wsa);
    //Creamos el socket
    sock=socket(AF_INET,SOCK_STREAM,0);
    //defnimos dirección por defecto, ipv4 y el puerto 9999
    local.sin_family=AF_INET;
    local.sin_addr.s_addr=INADDR_ANY;
    local.sin_port=htons(9999);
    //asociamos el socket al puerto
    if(bind(sock, (SOCKADDR*) &local, sizeof(local))==-1)
    {
       printf("Error en el bind\n");
       getch();
       exit(1);
    }
    //ponemos el socket a la escucha
    if(listen(sock,1)==-1)
    {
       printf("Error en el listen\n");
       exit(1);
    }
    len=sizeof(struct sockaddr);
    //hay una conexión entrante y la aceptamos
    sock=accept(sock,(SOCKADDR*)&local,&len);
    /* Igualación de variables para su posterior devolución */
    *variable1=sock;
    *variable2=len;
}

La función para crear un subproceso:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <process.h>

void subproceso(void)
{
     /* Declaración de variables para el hijo */
     SOCKET sock;
     int len=0;
     char Buffer[1024];
     abrir_socket(&sock, &len);
     while(len!=0) //mientras estemos conectados con el otro pc
     {
          len=recv(sock,Buffer,1023,0); //recibimos los datos que envie
          if(len>0) //si seguimos conectados
          {
             Buffer[len]=0; //le ponemos el final de cadena
             printf("Texto recibido:%s",Buffer); //imprimimos la cadena recibida
          }
     }
     _endthread();
}

P.D.: Por si a alguien le resulta infumable leer todo esto, estoy programando en Dev-C++ así que el proyecto entero está aquí: http://www.deseos.ws/chat.zip (http://www.deseos.ws/chat.zip)


Título: Re: Programando un chat en C
Publicado por: afdlkglfgfdgfhgf en 10 Junio 2010, 04:35 am
yo tambien tube ese problema  ;D y te puedo dar unos consejillos, la Funcion accept creo que asi es , te devuelve un Identificador de la conexión, entonces cada conexión tendra su propio identificador UNICO , entonces te recomiendo que en un HILO aparte pongas la funcion aceptando y guardando los identificadores de CONEXION en un array de tipo SOCK y cuando quiera comunicarte , utilizes su respectivo Identificador, nose si entiendes lo que quiero decir, tengo un code en mi portatil , mañana lo pongo porque me da pereza prenderlo a esta hora  :silbar:


SSaludos.