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(..)
4 Réponses :
sans voir du code, il est difficile de dire à quel point c'est facile. Mais vous devriez em> être capable de remplacer les appels Winsock sur des analogues dans SYS / Socket.h. P>
Les seuls appels qui rendent le portage difficile sont les appels WSA *. P>
wsastartup () -> nop WSACLEANUP () -> NOP P>
socket / setSockopt -> socket / setSockopt p>
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. P>
ioctlsocket -> ioctl p>
Sous * Nix Nous n'aimons pas beaucoup les prises asynchrones et préférons utiliser l'appel système sélectionné (). P>
---- Le reste de cette réponse semble seulement appliquer à Win95 compatible Winsock ---- P>
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. P>
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 code>.
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 code> 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.
Cela dépendra si vous utilisez une fonctionnalité de réseau spécifique Windows spécifique ou si vous utilisez principalement l'API compatible BSD principalement. P>
Donc, si vous utilisez des ports d'achèvement des E / S et des entrées d'E / S chevauchés et d'autres parties avancées de l'API Winsock, les choses seront très difficiles à porter et si vous utilisez simplement les éléments compatibles BSD, il devrait alors Soyez facile d'écrire une couche de traduction mince ou même simplement avoir le démarrage et l'arrêt Winsock à l'intérieur d'une ... P>
Ceci peut aider: http://tangentsoft.net/wskfaq/articles/bsd- Compatibilité.html P>
Sur la base de cette liste de fonctions, les choses devraient travailler plus ou moins seulement. Ajouter 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. P> #if _win32 code> autour des appels vers
wsastartup code> et
wsacleanup code> (l'équivalent Linux est de ne rien faire, la bibliothèque des sockets est initialisée automatiquement). p>