11
votes

Portage Winsock aux prises Linux

J'ai un programme qui fait quelques réseaux utilisant Winsock et une de nos exigences actuellement consiste à porter sur notre programme à Linux. La seule chose qui nous arrête de faire cela est Winsock.

Ma question est la suivante: Quelle est facile de passer cela à une implémentation Linux? p>

Y a-t-il des pièges que je devrais être au courant, et si je comprends simplement les fichiers d'en-tête appropriés, quelle sorte de choses Devrai-je être sûr de manipuler? P>

Merci pour toute aide! P>

Je posterais le code mais je ne peux malheureusement pas en raison de raisons juridiques. Mais, notre code utilise les éléments suivants: P>

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


0 commentaires

4 Réponses :


0
votes

sans voir du code, il est difficile de dire à quel point c'est facile. Mais vous devriez être capable de remplacer les appels Winsock sur des analogues dans SYS / Socket.h.


0 commentaires

4
votes

Les seuls appels qui rendent le portage difficile sont les appels WSA *.

wsastartup () -> nop WSACLEANUP () -> NOP

socket / setSockopt -> socket / setSockopt

Sous * Nix, les sockets bloquent par défaut et il n'est pas nécessaire ou possible d'utiliser cet appel étrange setsockopt pour violouer.

ioctlsocket -> ioctl

Sous * Nix Nous n'aimons pas beaucoup les prises asynchrones et préférons utiliser l'appel système sélectionné ().

---- Le reste de cette réponse semble seulement appliquer à Win95 compatible Winsock ----

Malheureusement, car la prise d'origine () dans Winsock a été brisée dans certains cas, vous avez probablement utilisé WSaSocket () et doit donc convertir ces appels.


6 commentaires

Notre code utilise Socket (), j'ai posté quelles fonctions sont utilisées dans le code, car je ne peux pas publier le code actuel.


Impossible de violer le blocage? Il est possible d'effectuer des E / S non bloquants sur des sockets en réglant l'indicateur O_NONBLOCK sur un fichier de socket Descripteur utilisant fcntl (2). Vous avez raison, ce que c'est une fonction différente, pas setSockopt .


Ben Voigt: Exactement. L'appel de Windows SetSockopt est appelé MODE NULL et SETS MODE pour toutes les nouvelles prises.


Je n'ai jamais appelé setSockopt sur une poignée null. Où est-ce que ce comportement est documenté?


C'est drôle, je ne trouve plus la documentation en ligne. Peut-être parce que j'utilisais toujours le numéro de version compatible Win9x de Winsock dans l'initialisation, c'est pourquoi il avait le comportement amusant.


Lecture sur la référence MSDN Winsock ( msdn.microsoft.com/en-us/library/windows/desktop/.../a>) ne me conduise pas à croire que Windows et Linux traitent des prises de blocage différemment.




10
votes

Sur la base de cette liste de fonctions, les choses devraient travailler plus ou moins seulement. Ajouter #if _win32 autour des appels vers wsastartup et wsacleanup (l'équivalent Linux est de ne rien faire, la bibliothèque des sockets est initialisée automatiquement).

Vous avez également besoin d'un code dépendant du système d'exploitation lors de la réglage des options de prise, certaines sont identiques, certaines ne sont pas, et les types peuvent être différents.


0 commentaires