Foros - Stratos

Programadores => Programación en red => Mensaje iniciado por: LC0 en 30 de Septiembre de 2005, 05:23:01 PM

Título: Diferencias Entre Los Sockets Bsd De Linux Y Windo
Publicado por: LC0 en 30 de Septiembre de 2005, 05:23:01 PM
 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 :).
Título: Diferencias Entre Los Sockets Bsd De Linux Y Windo
Publicado por: zupervaca en 30 de Septiembre de 2005, 05:30:02 PM
 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
Título: Diferencias Entre Los Sockets Bsd De Linux Y Windo
Publicado por: ethernet en 30 de Septiembre de 2005, 11:28:00 PM
 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

Título: Diferencias Entre Los Sockets Bsd De Linux Y Windo
Publicado por: LC0 en 01 de Octubre de 2005, 03:27:59 PM
 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.
Título: Diferencias Entre Los Sockets Bsd De Linux Y Windo
Publicado por: zupervaca en 01 de Octubre de 2005, 04:31:23 PM
 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 ;)  
Título: Diferencias Entre Los Sockets Bsd De Linux Y Windo
Publicado por: ZeruGiran en 01 de Noviembre de 2005, 11:17:55 PM
 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 SolarSockets

Multiplataforma (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.