Hola.
Tendré que reescribir esto desde cero, ya que antes se me cerró el navegador misteriosamente, pero bueno, ahí va (nooo) :
Estoy metido en un pequeño proyecto de una biblioteca de red para juegos, básicamente en tiempo real (vamos, UDP), implementándola a partir de la biblioteca SDL_net.
El caso es que antes estaba haciéndola con los sockets BSD, pero decidí cambiar ya que portar estos a Windows no es tan sencillo como en un principio me parecía.
A la hora de hacer la prueba fatal (ejecutar el servidor, luego el cliente y, tras mandarle este último un mensaje, el servidor imprime "Recibido, líder rojo"). Esta prueba la he reducido a que el servidor espere que un jugador se conecte, y que, cuando ocurra, este envie una petición para unirse al juego y el servidor se ponga contento al descubrir que no está solo en el universo, y aceptarle en la partida.
Con los sockets BSD no había ningún problema al hacer esto (ya digo, tanto cliente como servidor bajo el mismo ordenador), pero con SDL_net, el cliente se aborta abruptamente con un flamante "SDL Parachute Deployed". Si hago que el puerto del socket del servidor sea diferente al del cliente, elimino este fallo; pero claro, obviamente, el mensaje no llega a recibirse.
Mi pregunta es: ¿Estoy haciendo algo mal o realmente tendré que comprarme un portátil, instalarme una máquina virtual como Quemu, o depender de algún amigo para realizar las pruebas, para ejecutar al cliente y al servidor en diferentes máquinas?
Os pongo los trozos de código relevantes.
Este de aquí es el servidor:
int main(int argc, char** argv)
{
GDServerr Serverr;
Serverr.startServer();
while(1)
Server.adminIncomingConnections();
return 0;
}
El miembro adminIncomingConnections:
void GDServer::adminIncomingConnections()
{
UDPpacket p;
if(SDLNet_UDP_Recv(SocketConnections,&p))
{
std::cout << "Mensaje de conexión recibido: " << (int)p.data[0] << std::endl;
if(CurrentClients<MaxClients)
{
CurrentClients++;
Sockets.push_back(SDLNet_UDP_Open(p.address.port));
SDLNet_UDP_AddSocket(SocketSet,Sockets[Sockets.size()-1]);
}
}
}
El cliente:
int main(int argc, char** argv)
{
GDClient client;
if(!client.connect("127.0.0.1"))
cout << "Fallo en la comunicación con el servidor" << endl;
return 0;
}
Y el método connect:
//Connection to a server
bool GDClient::connect(const char* dir,int timeout,int port) /*throw(GDError)*/
{
AdminSocket=SDLNet_UDP_Open((Uint16)port);
IPaddress Ip;
SDLNet_ResolveHost(&Ip,const_cast<char*>(dir),(Uint16)port);
int channel=SDLNet_UDP_Bind(AdminSocket,-1,&Ip);
if(channel==-1)
std::cerr <<"GDClient::Connect(): No se pudo crear canal. "<< SDLNet_GetError() << std::endl;
UDPpacket* packet=SDLNet_AllocPacket(sizeof(Uint8));
packet->data[0] = GD_NETMSG_CONNECT;
if(!SDLNet_UDP_Send(AdminSocket,channel,packet))
std::cerr <<"GDClient::Connect() : No se pudo enviar mensaje. "<< SDLNet_GetError() << std::endl;
Uint32 t1=SDL_GetTicks();
while(SDL_GetTicks() - t1 <= (Uint32)timeout)
{
if(SDLNet_UDP_Recv(AdminSocket,packet))
{
SDLNet_FreePacket(packet);
return true;
}
}
SDLNet_FreePacket(packet);
return false;
}
Muchísimas gracias de antemano

.