webentwicklung-frage-antwort-db.com.de

Woher bekommt man die Header-/Quelldatei "sys/socket.h"?

Ich habe versucht, einen Server im C++ Unix-Stil zu schreiben, stecke aber auf einem Windows-Rechner fest. Ich habe mit MinGW angefangen, aber es wurde nicht richtig kompiliert und sagte mir, dass es die Datei "sys/socket.h" nicht finden konnte. Was natürlich notwendig ist, damit der Server überhaupt funktioniert. Ich suchte danach, und ich glaube, irgendwo wurde gesagt, ich solle stattdessen Cygwin installieren, da es eine Menge Bibliotheken enthält. Okay, ich habe es installiert. Jede einzelne Bibliothek, die sie mir anbieten könnte. Dann ging ich wieder zum Kompilieren, und es kann immer noch nicht gefunden werden. Ich habe den Entire-Enthält-Ordner durchsucht und konnte die Datei nicht finden. Also war ich ein bisschen verärgert (3 Stunden für zusätzliche Funktionen, die ich nicht brauche), aber ich suchte weiter. Ich kann es nicht überall finden. Ich finde mehrere Hinweise zur Verwendung, aber ich kann NIEMALS finden, um es herunterzuladen. Ich habe die letzten paar Stunden gesucht und bin mit allem sehr frustriert, weil es KEINE Hinweise gibt, wo ich es bekommen kann (und ich werde WINSock NICHT verwenden. Das bricht die Kompatibilität, wenn ich mich recht erinnere).

Um es kurz zu machen: Wo kann ich die Dateien 'socket.h'/'socket.c'/'socket.cpp' herunterladen? Es würde mein Leben erleichtern (und ich bin sicher, das Leben vieler anderer) SO viel einfacher, und ich würde es wirklich schätzen!

22
AnonymousJohn

Da Windows kein sys/socket.h hat, können Sie in etwa Folgendes tun:

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

Ich weiß, dass Sie angegeben haben, dass Sie WinSock nicht verwenden werden, aber da WinSock wie TCP Vernetzung unter Windows ist, sehe ich keine Alternative. Selbst wenn Sie eine plattformübergreifende Netzwerkbibliothek verwenden, ruft diese Bibliothek WinSock intern auf. Die meisten der Standard-BSD-Sockets-API-Aufrufe sind in WinSock implementiert. Mit etwas Nachdruck können Sie dasselbe Sockets-basierte Programm unter Windows und anderen Betriebssystemen kompilieren. Vergessen Sie einfach nicht, eine zu tun

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

am oberen Rand von main () ... andernfalls schlagen alle Socket-Aufrufe unter Windows fehl, da das WSA-Subsystem nicht für Ihren Prozess initialisiert wurde.

33
Jeremy Friesner

Da Sie die Frage mit C++ gekennzeichnet haben, können Sie boost :: asio , ACE oder eine andere plattformübergreifende Socketbibliothek für C++ oder für C verwenden. Plattformbibliotheken finden Sie in den Antworten auf die C++ - Socketsbibliothek für plattformübergreifende und plattformübergreifende Netzwerk-API .

Angenommen, die Verwendung einer plattformübergreifenden Sockets-Bibliothek eines Drittanbieters ist für Sie keine Option ...

Der Header <sys/socket.h> ist in IEEE Std definiert. 1003.1 (POSIX), aber leider entspricht Windows nicht dem POSIX-Standard. Der MinGW-Compiler ist eine GCC-Portierung zum Kompilieren von Windows-Anwendungen und enthält daher diese POSIX-System-Header nicht. Wenn Sie GCC mit Cygwin installieren, werden diese Systemheader eingeschlossen, um eine POSIX-Umgebung unter Windows zu emulieren. Beachten Sie jedoch, dass Sie, wenn Sie Cygwin für Sockets verwenden, die a.) Benötigen, den cygwin DLL an einem Ort platzieren müssen, an dem Ihre Anwendung sie lesen kann, und b.) Cygwin-Header und Windows-Header nicht interagieren sehr gut (wenn Sie also windows.h einbeziehen möchten, möchten Sie sys/socket.h wahrscheinlich nicht angeben).

Meine persönliche Empfehlung wäre, eine Kopie von VirtualBox herunterzuladen, eine Kopie von Ubuntu herunterzuladen, Ubuntu in VirtualBox zu installieren und dann das Kodieren und Testen auf Ubuntu durchzuführen. Alternativ wird mir gesagt, dass Microsoft ein "UNIX-Subsystem" verkauft und auf bestimmten höheren Editionen von Windows vorinstalliert ist, obwohl ich keine Ahnung habe, wie kompatibel dieses System ist (und, wenn es mit welcher Edition kompatibel ist) des UNIX-Standards ist es konform). Winsockets sind ebenfalls eine Option, obwohl sie sich auf subtile Weise anders als ihre POSIX-Pendants verhalten können, obwohl die Signaturen möglicherweise ähnlich sind.

10

Versuchen Sie, cygwin mit dem ausgewählten Paket erneut zu installieren: gcc-g ++: gnu compiler collection c ++ (aus der Kategorie devel), openssh-Server und Client-Programm (net) Editoren), eine gemeinsame ANSI-LISP-Implementierung (math) und libncurses-devel (lib).

Diese Bibliotheksdateien sollten sich unter cygwin\usr\include befinden

Grüße.

1
Adamos19

Ich möchte nur hinzufügen, wenn Sie die Windows-Socket-Bibliothek verwenden möchten, müssen Sie:

  • am Anfang: WSAStartup () aufrufen

  • am Ende: WSACleanup () aufrufen

Grüße;

0
Adamos19