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: #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: #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: #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.
|