elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programando un chat en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Programando un chat en C  (Leído 4,594 veces)
BeLGaRioN

Desconectado Desconectado

Mensajes: 81



Ver Perfil
Programando un chat en C
« 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


En línea

Comunidad hispana dedicada a la Plataforma Steam | http://www.plataformasteam.com
afdlkglfgfdgfhgf

Desconectado Desconectado

Mensajes: 92


Ver Perfil
Re: Programando un chat en C
« Respuesta #1 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.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines