Hola.
No se si alguien se acordará del último post que puse por aqui: Hablaba de una especie de biblioteca cutre orientada a juegos para el envío de datos a través de la red, y trataba de implementarla usando SDL_Net.
Mi objetivo inicial era usar una biblioteca de sockets totalmente multiplataforma sin tener que recurrir a los sockets BSD, ya que, si se diera la casualidad de que a alguien le diera por usarla, mayormente la querría para trabajar sobre Windows).
Como se ve que la opción de la SDL_Net no ha sido posible (me estaban saliendo unos problemas rarísimos que no había por donde cogerlos), me puse a indagar y a buscar otras biblioteca para esto. Con todas las que probé, el fracaso fue rotundo.
Asi que decidí volver a los sockets BSD, ya que, por lo visto, estoy condenado a volver a ellos. Probé el mini-protocolo para que un jugador se una a un servidor con un amigo que también tiene Linux y funcionó perfectamente.
Esta biblioteca envía y recibe internamente char*'s mediante udp. Mi pregunta es... ¿podré portarla a Windows a la perfección cambiando simplemente las cabeceras por winsock.h y llamando al WSAStartup, o me toparé con algún bache añadido e inesperado? ¿Alguien ha tenido la experiencia de hacer algo parecido a esto? (es decir, hacer algo con los sockets bsd bajo Linux y luego portarlo a Windows)
Gracias de antemano again :).
solo debes tener en cuenta que si un dato es superior a un byte tienes que pasarlo a formato de red, en c se usa hton o ntoh, este cambio es importante si tienes pensado hacerlo multiplataforma
Hay varias cosas que debes tener en cuenta:
- Cuidado con el formato de datos que pasas a send y sendto porque en unix aceptan void* y en windows unsigned char*
- Cuidado con los select, la implementación de windows de todo ese tema _da grima_, no tienes más que mirar las cabeceras. Windows aporta una serie de funciones para eso que son bastante más interesantes.
- cambia los close en linux/unix por closesocket en windows.
- perror en unix da información acerca de los errores de sockets, en windows debes usar las funciones a tal efecto, que si no recuerdo es WSAGetLastError.
- En general, cuidado con las funciones que retornan un puntero, suele apuntar a una variable static y es una putada cuando haces dos llamadas seguidas y se sobreescribe el valor.
- En algunas versiones de windows (98/me) cuidado con los tamaños de paquete de UDP y cuidado sobretodo con los errores, te explico, cuando tu mandas un paquete a una windosw 98 a un puerto que no está esperando datos, no pasa nada, sin embargo si lo haces contra un w2k lanza un ICMP (creo que port unreachable) y el sendto te lanza un error. Incluso el quake falla a veces por ese tema :)
- Aunque parezca una chorrada, cuidado con hacer sizeofs de punteros, es muy común llegar y hacer char* p;...;send(s,p, sizeof(p),0); Es de muy principiante, pero me he encontrado por ahí muchas personas diciendo: "solo me llegan 4 bytes y yo mando más..."
- Usa send y recv, así te será más simple portarlo. Lo digo por que a veces en unix se usa write, read para leer /escribir.
Yo hice una librería que está en el código de la semana que, si no recuerdo mal, tira en windows/linux, puede que te sirvam ncluso tiene funciones útiles para manejar ip's y demás
un saludo
Pues muchas gracias, ethernet :D. Salvo por el tema del close/closesocket, no creo que tenga demasiado problema con lo demás (Esperemos :D).
Con respecto al tema de que los punteros devueltos van a apuntar a una variable estátican cliente reciba un mensaje hace un strdup de la cadena recibida, y la pone en una pila de datos recibidos.
Bueno, y gracias a ti también, zupervaca, lo que pasa es que la información se ajustaba mejor a lo que dijo ethernet :D.
no pasa nada, yo te puse los problemas que me encontre cuando estuvimos haciendo el wic messenger, que el servidor era linux y el cliente windows ;)
Yo vengo a hacer un poco de Spam :P
Citar
Asi que decidí volver a los sockets BSD, ya que, por lo visto, estoy condenado a volver a ellos.
Prueba con esta libreria TCP
SolarSocketsMultiplataforma (win lin), rula en varios compiladores, orientada a eventos, y usa threads nativos de la plataforma, en lugar de selects.
Mira los ejemplos en la pagina. Y hay mas ejemplos en el zip.
Fin del Spam.
Ya pronto la version Orientada a objetos. De hecho ya esta codeada, pero esta en pruebas.