2009-10-05 32 views
22

Ich habe gerade versucht, Netcat in MSYS mit MinGW zu bauen und erkannte, dass MinGW nie wirklich alle BSD-Socket-Sachen nach Windows portierte (zB sys/socket.h). Ich weiß, dass Sie Windows Sockets in MinGW verwenden können, aber warum haben sie nie einen Windows-Port der BSD-Sockets gemacht? Ich habe einige Programme mit # ifdef zur Problemumgehung bemerkt. Gibt es irgendwo einen Windows-Port der BSD-Sockets, der stattdessen verwendet werden kann?Sockets in MinGW

Hier sind die Fehler, wenn eine Marke für netcat in MSYS tun:


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 
 

Es gibt keine # ifdef 's für MinGW. Gibt es eine Bibliothek/ein Paket, das ich zu MSYS hinzufügen kann, um alles ohne Fehler kompilieren zu lassen?

Hinweis: Sie netcat herunterladen können here und durchsuchen Sie die CVS-Repo here

+0

Winsock selbst war ursprünglich ein Port der Berkeley Sockets API. – ChrisW

+0

@ChrisW, ich habe nie verstanden, was es heißt, Winsock anders als UNIX zu machen? – Pacerier

+0

@Pacerier Ich denke, dass Winsock einfacher ist, da es weniger Header-Dateien enthält. Siehe z.B. [Übergang von UNIX zu Windows Socket Programming] (http://cs.baylor.edu/~donahoo/practical/CSockets/WindowsSockets.pdf) für weitere Details. – ChrisW

Antwort

2

Wie ChrisW sagte, ist Winsock2 eine Portierung von BSD-Sockets. Welchen Teil von Winsock versuchst du zu verwenden, was sich von BSD Sockets unterscheidet? (außer WSAStartup und WSACleanup)

+2

Ich versuche nur netcat zu kompilieren. Ich werde die Frage mit den aktuellen Fehlern aktualisieren. – User1

+1

Ersetzen Sie alle diese Includes durch '#include ' als das wäre die entsprechende Kopfzeile für Winsock, dann sehen, was passiert. – GRB

+3

Wenn Sie das tun, müssen Sie auch eine Verbindung mit WS2_32 herstellen und WSAStartup/WSACleanup verwenden. Was * könnte * Sie zum Laufen bringen. – tmpvar

3

MingWin ist minimalistisch und das ist der wichtigste Aspekt. Weil es das Verständnis erleichtert, ist es letztendlich Sache des Entwicklers, die Anwendung zu schreiben. MingWin macht die Dinge nur einfacher, macht aber keine Zauberei, wenn es darum geht, nix-Apps an Windows zu hängen.

+0

Also sollen wir zwei Kopien von Code für jede einzelne Funktionalität schreiben? Wann ist das sinnvoll? – Pacerier

6

WinSock und WinSock2 haben unterschiedliche Funktionsnamen von den BSD Sockets. Wenn ich plattformübergreifende Anwendungen schreiben möchte, habe ich viele Workarounds programmiert, um Microsoft glücklich zu machen.

Es wäre so viel einfacher, wenn spezielle "socket.h" und "socket.c" Dateien in MinGW enthalten wären, die einfach durch das Aufrufen der jeweiligen WinSock2-Gegenstücke übersetzen würden.

Ich fange gerade an, C-Programmierung zu lernen, also kann ich das selbst nicht machen, aber ich bin überrascht, dass das bisher noch niemand versucht hat.

21

BSD sys/socket.h ist ein POSIX-Header und die Win32-API unterstützt es nicht. MinGW-Header sind nur eine Neuimplementierung von nativen Win32-Headern und bieten keine zusätzliche POSIX-Kompatibilität.

Wenn Sie nach sys/socket.h Unterstützung suchen, versuchen Sie entweder GNU gnulib sys/socket.h replacement oder gehen Sie mit Cygwin, die eine POSIX-Kompatibilität Wrapper unter Windows bietet.

+4

Ich habe gerade bemerkt, dass die Frage fast 2 Jahre alt ist. Dennoch ist die Antwort vielleicht für jemanden in der Zukunft nützlich. – kalev

+0

über gnulib für mingw: "Einige Module werden zur Zeit nicht unterstützt: mgetgroups, getugroups, idcache, usespec, openpty, login_tty, gabelpty, pt_chown, grantpt, pty, savewd, mkancesdirs, mkdir-p, euidaccess, faccessat.", Mingw im 64-Bit-Modus ist nicht getestet und niedrige Priorität bisher "http://www.gnu.org/software/gnulib/manual/gnulib.html#Target-Platforms –

+0

@ Kalev, ich habe das nie verstanden. Was ist der Sinn von Gnulib, wenn es schon Cygwin gibt? – Pacerier

4

Diese Kommentare von einer anderen Antwort diente als die Antwort, die ich brauchte, um ein Stück einfachen bsd-Socket-Code zu kompilieren mit mingw auf Windows zu bekommen.

Ersetzen Sie alle diese enthält mit #include als würde die entsprechende Header für Winsock sein, dann sehen, was passiert.

Sie müssen auch mit ws2_32 verknüpfen und WSAStartup/WSACleanup verwenden. Was dich zum Laufen bringen könnte.

EDIT: ich auch close mit shutdown/closesocket und write mit send ersetzen zu müssen endete. Der Code kompiliert, aber funktionierte nicht ohne diese zusätzlichen Änderungen.

2

Gibt es eine Bibliothek/ein Paket, das ich MSYS hinzufügen kann, um alles kompilieren ohne Fehler?

MSYS ist eine Gabel von Cygwin. Es bietet eine BSD-Sockets-API wie Cygwin. Wenn Sie MSYS haben, sollten Sie nur in der Lage sein, Ihren Code wie folgt zu kompilieren:

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

Die -I/include benötigt wird, um die Compiler zu zwingen, in den MSYS Verzeichnis gehören zu suchen.

Und Link wie folgt:

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