Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Diferencias Entre Los Sockets Bsd De Linux Y Windo

Iniciado por LC0, 30 de Septiembre de 2005, 05:23:01 PM

« anterior - próximo »

LC0

 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 :).

zupervaca

 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

ethernet

 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


LC0

 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.

zupervaca

 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 ;)  

ZeruGiran

 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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.