web-dev-qa-db-fra.com

Prises en MinGW

J'essayais juste de construire netcat dans MSYS en utilisant MinGW et j'ai réalisé que MinGW n'avait jamais vraiment porté tous les trucs de socket BSD vers Windows (par exemple sys/socket.h). Je sais que vous pouvez utiliser les sockets Windows dans MinGW, mais pourquoi n'ont-ils jamais créé de port Windows pour les sockets BSD? J'ai remarqué pas mal de programmes utilisant # ifdef pour contourner le problème. Existe-t-il un port Windows des sockets BSD qui peut être utilisé à la place?

Voici les erreurs lors de la création d'un make pour netcat dans MSYS:


gcc -DLOCALEDIR=\"\/usr/local/share/locale\" -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -Wall -c `test -f 'core.c' || echo './'`core.c
In file included from core.c:29:
netcat.h:38:24: sys/socket.h: No such file or directory
netcat.h:39:63: sys/uio.h: No such file or directory
netcat.h:41:24: netinet/in.h: No such file or directory
netcat.h:42:55: arpa/inet.h: No such file or directory

Il n'y a pas de # ifdef pour MinGW. Existe-t-il une bibliothèque/un package que je peux ajouter à MSYS pour que tout se compile sans erreur?

Remarque: Vous pouvez télécharger netcat ici et parcourir le dépôt CVS ici

23
User1

BSD sys/socket.h est un en-tête POSIX et l'API win32 ne le prend pas en charge. Les en-têtes MinGW ne sont qu'une réimplémentation des en-têtes win32 natifs et n'offrent pas de compatibilité POSIX supplémentaire.

Si vous recherchez un support pour sys/socket.h, essayez soit GNU gnulib's remplacement sys/socket.h ou allez avec Cygwin , qui fournit un wrapper de compatibilité POSIX sous Windows.

25
kalev

WinSock et WinSock2 ont des noms de fonction différents des sockets BSD. Si je souhaite écrire des applications multiplates-formes, j'ai du code pour beaucoup de contournements juste pour garder Microsoft heureux.

Ce serait tellement plus facile s'il y avait des fichiers spéciaux "socket.h" et "socket.c" inclus avec MinGW qui traduisaient simplement des trucs en appelant les contreparties WinSock2 respectives.

Je commence tout juste à apprendre la programmation C, donc je ne peux pas le faire moi-même, mais je suis surpris que personne ne semble avoir même essayé jusqu'à présent.

7
Randolf Richardson

Ces commentaires d'une autre réponse ont servi de réponse pour obtenir un morceau de code de socket bsd simple à compiler avec mingw sur Windows.

Remplacez toutes ces inclusions par #include car ce serait l'en-tête équivalent pour Winsock, puis voyez ce qui se passe.

Vous devrez également établir une liaison avec ws2_32 et utiliser WSAStartup/WSACleanup. Ce qui pourrait vous permettre d'être opérationnel.

EDIT: J'ai également dû remplacer close par shutdown/closesocket et write par send. Le code s'est bien compilé mais n'a pas réellement fonctionné sans ces modifications supplémentaires.

4
davenpcj

Voir le lien stackoverflow: Où obtient-on le fichier d'en-tête/source "sys/socket.h"?

La réponse/solution est plus explicite.

3
jlguenego

MingWin est minimaliste, et c'est l'aspect le plus important de celui-ci. Parce que cela facilite la compréhension, à la fin, il est de la responsabilité du développeur d'écrire l'application. MingWin ne fait que rendre les choses plus faciles mais ne fait pas de magie en turing les applications nix sur Windows.

3
user237890

Comme l'a dit ChrisW, Winsock2 est un port de sockets BSD. Quelle partie de Winsock essayez-vous d'utiliser qui diffère des sockets BSD? (autre que WSAStartup et WSACleanup)

2
Andrew Keith

Existe-t-il une bibliothèque/un package que je peux ajouter à MSYS pour que tout se compile sans erreur?

MSYS est un fork de Cygwin. Il fournit une API de sockets BSD tout comme Cygwin. Si vous avez MSYS, vous devriez simplement pouvoir compiler votre code comme ceci:

gcc -c -o test.o test.c -I/include

Le -I/include est nécessaire pour forcer le compilateur à rechercher dans le répertoire d'inclusion MSYS.

Et un lien comme celui-ci:

gcc -o test.exe test.o /bin/msys-1.0.dll
2
Oktalist