web-dev-qa-db-fra.com

Où trouve-t-on l'en-tête/le fichier source "sys/socket.h"?

J'ai essayé d'écrire un serveur dans le style Unix C++, mais je suis bloqué sur une machine Windows. J'ai commencé avec MinGW, mais il n'a pas bien compilé et m'a dit qu'il ne pouvait pas trouver le fichier "sys/socket.h". Ce qui, bien sûr, est nécessaire pour que le serveur fonctionne même. Je suis allé le chercher, et je pense que quelque part, il a été dit d'installer Cygwin à la place, car il est livré avec de nombreuses bibliothèques. Ok, alors je l'ai installé. Chaque bibliothèque qu'elle pourrait éventuellement m'offrir. Ensuite, je suis allé à compiler à nouveau, et il ne peut toujours pas le trouver. Je suis allé chercher dans le dossier complet comprend, et n'a pas pu trouver le fichier. Donc, j'étais un peu vexé (3 heures de jeu pour des fonctionnalités supplémentaires dont je n'ai pas besoin), mais j'ai continué à chercher. Je ne peux le trouver nul part. Je trouve de multiples références à l’utiliser, mais je ne trouve nulle part ailleurs de le télécharger. Je cherche depuis quelques heures maintenant et je suis devenu très frustré par tout car il n’ya AUCUNE référence à où je peux l’obtenir (et je n’utiliserai PAS Winsock. Cela brise la compatibilité si je me souviens bien).

Alors, bref, où puis-je télécharger les fichiers 'socket.h'/'socket.c'/'socket.cpp'? Cela faciliterait ma vie (et je suis sûr que la vie de beaucoup d'autres) SO serait beaucoup plus facile et je l'apprécierais vraiment!

22
AnonymousJohn

Étant donné que Windows n’a pas de sys/socket.h, vous pourriez envisager de faire quelque chose comme ceci:

#ifdef __WIN32__
# include <winsock2.h>
#else
# include <sys/socket.h>
#endif

Je sais que vous avez indiqué que vous n’utiliseriez pas WinSock, mais comme WinSock est la méthode de mise en réseau de TCP sous Windows, je ne vois pas d’autre solution. Même si vous utilisez une bibliothèque réseau multiplate-forme, cette bibliothèque appellera WinSock en interne. La plupart des appels d'API sockets BSD standard sont implémentés dans WinSock. Ainsi, avec un peu de futzing, vous pouvez compiler le même programme basé sur des sockets sous Windows et d'autres systèmes d'exploitation. N'oubliez pas de faire un

#ifdef __WIN32__
   Word versionWanted = MAKEWORD(1, 1);
   WSADATA wsaData;
   WSAStartup(versionWanted, &wsaData);
#endif

en haut de main () ... sinon tous vos appels de socket échoueront sous Windows, car le sous-système WSA n'a pas été initialisé pour votre processus.

33
Jeremy Friesner

Etant donné que vous avez étiqueté la question C++, vous pourriez être intéressé par l’utilisation de boost :: asio , ACE , ou d’une autre bibliothèque de sockets multi-plateformes pour C++ ou C. Vous trouverez des bibliothèques de plates-formes dans les réponses à Bibliothèque de sockets C++ pour API multiplate-forme et API de mise en réseau multiplate-forme .

En supposant que l'utilisation d'une bibliothèque de sockets multiplate-forme tierce ne soit pas une option pour vous ...

L'en-tête <sys/socket.h> est défini dans IEEE Std. 1003.1 (POSIX), mais malheureusement, Windows n'est pas conforme à la norme POSIX. Le compilateur MinGW est un port de GCC pour la compilation d'applications Windows et n'inclut donc pas ces en-têtes système POSIX. Si vous installez GCC avec Cygwin , il inclura ces en-têtes système pour émuler un environnement POSIX sous Windows. Sachez cependant que si vous utilisez Cygwin pour les sockets qui, a.), Vous devez placer cygwin DLL à un endroit où votre application peut le lire et b.) Les en-têtes Cygwin et Windows ne sont pas compatibles. très bien (donc si vous envisagez d’inclure windows.h, vous ne voudrez probablement pas inclure sys/socket.h).

Ma recommandation personnelle serait de télécharger une copie de VirtualBox , de télécharger une copie de Ubuntu , d'installer Ubuntu dans VirtualBox, puis de coder et de tester Ubuntu. Alternativement, on me dit que Microsoft vend un "sous-système UNIX" et qu'il est pré-installé sur certaines éditions haut de gamme de Windows, bien que je ne sache pas à quel degré ce système est conforme (et, s'il est conforme, à quelle édition). de la norme UNIX, il est conforme). Les winsockets sont également une option, bien qu'ils puissent se comporter de manière légèrement différente de leurs homologues POSIX, même si les signatures peuvent être similaires.

10

Essayez de réinstaller cygwin avec le paquet sélectionné: gcc-g ++: collection de compilateurs gnu c ++ (à partir de la catégorie devel), serveur openssh et programme client (net), make: la version de gnu (devel), ncurses terminal (utils), optimisé vim editors ( éditeurs), une implémentation LISP commune ANSI (maths) et libncurses-devel (lib).

Ces fichiers de bibliothèque doivent être sous cygwin\usr\include

Cordialement.

1
Adamos19

J'aimerais juste ajouter que si vous voulez utiliser la bibliothèque de socket Windows, vous devez:

  • au début: appelez WSAStartup ()

  • à la fin: appelez WSACleanup ()

Cordialement;

0
Adamos19