Ver Mensaje Individual
  #6 (permalink)  
Antiguo 06/08/2011, 19:21
Apeiron
 
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!