2011-01-06 14 views
5

Tengo un programa que hace algunas redes usando Winsock, y uno de nuestros requisitos ahora es transferir nuestro programa a Linux. Lo único que nos impide hacer esto es Winsock.Conexión de Winsock a sockets de Linux

Mi pregunta es: ¿Qué tan fácil puedo llevar esto a una implementación de Linux?

¿Hay algún error que deba conocer, y si simplemente incluyo los archivos de encabezado apropiados, qué tipo de cosas tendré que asegurarme?

¡Gracias por cualquier ayuda!

Me gustaría publicar el código, pero desafortunadamente no puedo por razones legales. embargo, nuestro código usa el siguiente:

WSAStartup(..) 
WSACleanup(..) 
Socket(..) 
sendto(..) 
recvfrom(..) 
ioctlsocket(..) 
setsocketopt(..) 

Respuesta

6

Depende si usa alguna funcionalidad de red específica de Windows o si solo está usando la mayoría de las API compatibles con BSD.

Por lo tanto, si usa E/S superpuestas y puertos de finalización de E/S y otras partes avanzadas de la API de Winsock, entonces será muy difícil portarlos y si solo está utilizando las cosas compatibles con BSD, entonces debe ser fácil de escribir una capa de traducción delgada o incluso sólo tener la puesta en marcha del Winsock y cosas por el apagado dentro de un ifdef específica ventanas ...

Esto puede ayudar: http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

0

Sin ver el código, es difícil decir lo fácil que es. Pero usted debería ser capaz de reemplazar las llamadas winsock a análogos en sys/sockets.h.

3

Las únicas llamadas que dificultan la transferencia son las llamadas WSA *.

WSAStartup() -> nop WSACleanup() -> nop

Socket/setsockopt -> Toma/setsockopt

Bajo * nix, zócalos están bloqueando de forma predeterminada y no es necesario o posible utilizar esa extraña llamada de setsockopt para jugar con ella.

ioctlsocket -> ioctl

Bajo * nix no nos gusta mucho sockets asincrónicos y prefieren utilizar la llamada al sistema select().

---- resto de esta respuesta parece que sólo se aplican a Win95 Winsock compatible ----

WSASocket Por desgracia, como la toma original,() en Winsock fue roto en algunos casos, es probable que utilizó() y así que tengo que convertir esas llamadas.

+0

Nuestro código usa socket(), publiqué qué funciones se usan en el código, ya que no puedo publicar el código real. –

+0

no es posible jugar con el bloqueo? [Es posible hacer E/S sin bloqueo en sockets estableciendo el indicador O_NONBLOCK en un descriptor de archivo de socket usando fcntl (2).] (Http://linux.die.net/man/7/socket) Usted ' Sin embargo, hay que tener en cuenta que se trata de una función diferente, no de 'setsockopt'. –

+0

Ben Voigt: exactamente. La llamada a windows setsockopt se invoca en el manipulador NULL y establece el modo para todos los sockets nuevos. – Joshua

8

sobre la base de esa lista de funciones, las cosas deben más o menos solo trabajo Agregue #if _WIN32 a las llamadas a WSAStartup y WSACleanup (el equivalente de Linux es no hacer nada, la biblioteca de sockets se inicializa automáticamente).

También es posible que necesite algún código dependiente del sistema operativo al configurar las opciones de socket, algunas son iguales, otras no, y los tipos pueden ser diferentes.

Cuestiones relacionadas