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 originalprivate: System::Void Server_Click(System::Object^ sender, System::EventArgs^ e) {
WSADATA wsa;
SOCKET sockserver;
SOCKET AUX;
struct sockaddr_in local;
char* Buffer;
int len2=0;
//Inicializamos
WSAStartup(MAKEWORD(2,0),&wsa);
//Creamos el socket
sockserver=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//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(sockserver, (SOCKADDR*) &local, sizeof(local))==-1)Conversacion->Text="Error en el bind"; // error en el bind si se cumple
if (listen(sockserver,1)==-1)Conversacion->Text="Error al escuchar"; //ponemos el socket a la escucha y si cumple la funcion ERROR
len2=sizeof(struct sockaddr);// AQUI ESPERA UNA CONEXION
//hay una conexión entrante y la aceptamos
sockserver=accept(sockserver,(sockaddr*)&local,&len2);
Conversacion->Text="Servidor Conectado";
while (len2!=0) //mientras estemos conectados con el otro pc
{
len2=recv(sockserver,Buffer,1023,0); //recibimos los datos que envie
if (len2>0) //si seguimos conectados
{
Buffer[len2]=0; //le ponemos el final de cadena
String^ msg = gcnew String(reinterpret_cast<const char*>(Buffer));//convertimos la cadena
Conversacion->Text=msg;
}
}
Código C++:
Ver originalprivate: System::Void Cliente_Click(System::Object^ sender, System::EventArgs^ e) {
WSADATA wsa;
SOCKET sockcliente;
SOCKET AUX;
struct hostent *host;
struct sockaddr_in direc;
int conex;
//Inicializamos
WSAStartup(MAKEWORD(2,2),&wsa);
//resolvemos el nombre de dominio localhost, esto se resolverá a 127.0.0.1
host=gethostbyname("localhost");
//creamos el socket
sockcliente=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sockcliente==-1)Conversacion->Text="Error al crear el socket";// error
//Definimos la dirección a conectar que hemos recibido desde el gethostbyname
//y decimos que el puerto al que deberá conectar es el 9999 con el protocolo ipv4
direc.sin_family=AF_INET;
direc.sin_port=htons(9999);
direc.sin_addr = *((struct in_addr *)host->h_addr);
//Intentamos establecer la conexión
conex=connect(sockcliente,(sockaddr *)&direc, sizeof(sockaddr));
if (conex==-1)Conversacion->Text="Error al conectar";
else
{Conversacion->Text="Cliente Conectado";//si no se ha podido conectar porque no se ha encontrado el host o no está el puerto abierto
a = FALSE;
AUX=sockcliente;
socketc=AUX;
}
}
Código C++:
Ver originalprivate: System::Void Enviar_Click(System::Object^ sender, System::EventArgs^ e) {
// Conversion de string^ a cadena para poder utilizar la funcion send
String^ str = gcnew String(Escritura->Text);
IntPtr p = Marshal::StringToHGlobalAnsi(str);
char* buffer = static_cast<char*>(p.ToPointer());
// Enviamos el mensaje
int b;
b
=send
(socketc
,buffer
,strlen(buffer
),0); Marshal::FreeHGlobal(p);
}
Aqui esta , gracias por contestaaar!