Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con mini chat C++

Estas en el tema de Problema con mini chat C++ en el foro de C/C++ en Foros del Web. Buenas estoy haciendo un pequeño chat para practicar la api de windows y sockets en c++ y me ha surgido un problemilla os comento haber ...
  #1 (permalink)  
Antiguo 06/08/2011, 01:26
 
Fecha de Ingreso: agosto-2011
Mensajes: 17
Antigüedad: 12 años, 8 meses
Puntos: 0
Pregunta Problema con mini chat C++

Buenas estoy haciendo un pequeño chat para practicar la api de windows y sockets en c++ y me ha surgido un problemilla os comento haber que opinais. Resulta que he hecho una ventanita con 3 botones y 2 textbox, os pongo una pequeña descripcion de cada elemento.

-Boton Servidor ( Inicia el servidor,cuando acepta una conexion, sale un mensaje en TexTBox2 conforme esta conectado y recibe mensajes para despues mostrarlos en TexTBox2 )
-Boton Cliente ( Inicia el cliente y sale un mensaje en TextBox2 conforme esta conectado)
-Boton Enviar ( Envia el texto que hay en TextBox1 del cliente)

El problema es que conecta pero no envia el mensaje, almenos no sale por pantalla en el servidor.Entonces descarto que sea un problema de no conexion. Para poder utilizar la funcion send el mensaje tiene que ser una cadena de caracteres pero el texto de TextBox1 es un System::string^ , por tanto realizo la conversion a unsigned char y utilizo la funcion...y al recibir lo vuelvo a convertir en System::string^ y le digo que lo muestre en TextBox2. Os adjunto el codigo de enviar y recibir a ver si me podeis hechar un cable Graciaaaaaas!


Código C++:
Ver original
  1. //Codigo para enviar mensajes
  2. private: System::Void Enviar_Click(System::Object^  sender, System::EventArgs^  e) {
  3.  
  4.     // Conversion de string^ a cadena
  5.     String^ str = gcnew String(TextBox1->Text); //
  6.     IntPtr p = Marshal::StringToHGlobalAnsi(str);
  7.     char* buffer = static_cast<char*>(p.ToPointer());
  8.     Marshal::FreeHGlobal(p);
  9.                
  10.         // Enviamos el mensaje
  11.         int b;
  12.         b=send(socketc,buffer,strlen(buffer),0);



Código C++:
Ver original
  1. // Codigo para recibir mensajes y mostrarlos
  2. while (len!=0) //mientras estemos conectados con el otro pc
  3. {
  4. len=recv(sockserver,Buffer,1023,0); //recibimos los datos que envie
  5. if (len>0) //si seguimos conectados
  6. {
  7.     Buffer[len]=0; //le ponemos el final de cadena
  8.     String^ msg = gcnew String(reinterpret_cast<const char*>(Buffer));//convertimos la cadena
  9.     TextBox2->Text=msg;                    
  10. }}
  #2 (permalink)  
Antiguo 06/08/2011, 05:57
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con mini chat C++

Confirma que el send() tiene exito. Que valor esta retornando?
Es necesario liberar la memoria justo despues del static_cast y antes del envio? Podrias intentar postergar la liberacion de la memoria hasta despues del envio.
  #3 (permalink)  
Antiguo 06/08/2011, 13:47
 
Fecha de Ingreso: agosto-2011
Mensajes: 17
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Problema con mini chat C++

La funcion send no devuelve -1 , en principio envia...lo que pasa es que cuando intento hacer otro envio si que me devuelve -1 , por que ya no esta conectado.Cuando inicio el server...y entra en el bucle de recibir mensajes se queda pajarito el server...quizas es por que aun no he aprendido threads?
  #4 (permalink)  
Antiguo 06/08/2011, 15:14
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: Problema con mini chat C++

Si queires programar un chat, debes utilizar forzosamente hilos de ejecución o procesos hijos xD
  #5 (permalink)  
Antiguo 06/08/2011, 17:54
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema con mini chat C++

Estas seguro que la conexion esta establecida?? y que estas usando los socket correctos....

Podrias mostrar mas codigo... O tambien podiras hacr una prueba de socket sencilla por consola para aprender primero socket y despues combinar con Win32
  #6 (permalink)  
Antiguo 06/08/2011, 19:21
 
Fecha de Ingreso: agosto-2011
Mensajes: 17
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Problema con mini chat C++

Ya he hecho una prueba sencilla por consola y todo perfecto, no he podido hacer que los dos reciban y envien por que no he aprendido hilos aun...pero uno enviaba y recibia el otro perfectamente. Os adjunto los codigos de botones.

Código C++:
Ver original
  1. private: System::Void Server_Click(System::Object^  sender, System::EventArgs^  e) {
  2.  
  3.                 WSADATA wsa;
  4.                 SOCKET sockserver;
  5.                 SOCKET AUX;
  6.                 struct sockaddr_in local;
  7.                 char* Buffer;
  8.                 int len2=0;
  9.                 //Inicializamos
  10.                 WSAStartup(MAKEWORD(2,0),&wsa);
  11.                 //Creamos el socket
  12.                 sockserver=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  13.                 //defnimos dirección por defecto, ipv4 y el puerto 9999
  14.                 local.sin_family = AF_INET;
  15.                 local.sin_addr.s_addr = INADDR_ANY;
  16.                 local.sin_port = htons(9999);
  17.                 //asociamos el socket al puerto
  18.                 if (bind(sockserver, (SOCKADDR*) &local, sizeof(local))==-1)Conversacion->Text="Error en el bind"; // error en el bind si se cumple
  19.                 if (listen(sockserver,1)==-1)Conversacion->Text="Error al escuchar"; //ponemos el socket a la escucha y si cumple la funcion ERROR
  20.                 len2=sizeof(struct sockaddr);// AQUI ESPERA UNA CONEXION
  21.                 //hay una conexión entrante y la aceptamos
  22.                 sockserver=accept(sockserver,(sockaddr*)&local,&len2);
  23.                 Conversacion->Text="Servidor Conectado";
  24.                 while (len2!=0) //mientras estemos conectados con el otro pc
  25.                 {
  26.                 len2=recv(sockserver,Buffer,1023,0); //recibimos los datos que envie
  27.                 if (len2>0) //si seguimos conectados
  28.                 {
  29.                     Buffer[len2]=0; //le ponemos el final de cadena
  30.                     String^ msg = gcnew String(reinterpret_cast<const char*>(Buffer));//convertimos la cadena
  31.                     Conversacion->Text=msg;                    
  32.                 }
  33.                 }

Código C++:
Ver original
  1. private: System::Void Cliente_Click(System::Object^  sender, System::EventArgs^  e) {
  2.  
  3.             WSADATA wsa;
  4.             SOCKET sockcliente;
  5.             SOCKET AUX;
  6.             struct hostent *host;
  7.             struct sockaddr_in direc;
  8.             int conex;
  9.             //Inicializamos
  10.             WSAStartup(MAKEWORD(2,2),&wsa);
  11.             //resolvemos el nombre de dominio localhost, esto se resolverá a 127.0.0.1
  12.             host=gethostbyname("localhost");
  13.             //creamos el socket
  14.             sockcliente=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  15.             if (sockcliente==-1)Conversacion->Text="Error al crear el socket";// error
  16.             //Definimos la dirección a conectar que hemos recibido desde el gethostbyname
  17.             //y decimos que el puerto al que deberá conectar es el 9999 con el protocolo ipv4
  18.             direc.sin_family=AF_INET;
  19.             direc.sin_port=htons(9999);
  20.             direc.sin_addr = *((struct in_addr *)host->h_addr);
  21.             memset(direc.sin_zero,0,8);
  22.             //Intentamos establecer la conexión
  23.             conex=connect(sockcliente,(sockaddr *)&direc, sizeof(sockaddr));
  24.             if (conex==-1)Conversacion->Text="Error al conectar";
  25.             else
  26.                 {Conversacion->Text="Cliente Conectado";//si no se ha podido conectar porque no se ha encontrado el host o no está el puerto abierto
  27.                  a = FALSE;
  28.                  AUX=sockcliente;
  29.                  socketc=AUX;
  30.                  }
  31.          }

Código C++:
Ver original
  1. private: System::Void Enviar_Click(System::Object^  sender, System::EventArgs^  e) {
  2.  
  3.                 // Conversion de string^ a cadena para poder utilizar la funcion send
  4.                 String^ str = gcnew String(Escritura->Text);
  5.                 IntPtr p = Marshal::StringToHGlobalAnsi(str);
  6.                 char* buffer = static_cast<char*>(p.ToPointer());
  7.                 // Enviamos el mensaje
  8.                 int b;
  9.                 b=send(socketc,buffer,strlen(buffer),0);
  10.                 Marshal::FreeHGlobal(p);
  11.                
  12.              
  13.          }


Aqui esta , gracias por contestaaar!

Etiquetas: chat, socket, sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:14.