Warum hat Microsoft Sockets anders implementiert?

7

Ich bin gerade mitten in einem Projekt mit Sockets, und ich benutze nur Linux sys / socket.h Datei. Rufen Sie Microsoft den Port zu und erkennen Sie, dass Winsock anders ist. Ich denke, ich habe zwei Fragen.

Erstens, was sind die Hauptunterschiede zwischen den beiden Implementierungen? Gibt es einen einfachen Weg, sie zu "übersetzen"? Ein Link zu einem Leitfaden würde sehr geschätzt werden, denn Sie können mir wahrscheinlich bessere Links als Google bekommen.

Zweitens, warum hat Microsoft das getan? Was war ihre Motivation? Warum haben sie nicht dieselbe Implementierung wie alle anderen beibehalten?

    
Andrew Szeto 08.08.2009, 23:29
quelle

4 Antworten

12

Verzeihen Sie, wenn ich den Punkt verpasst habe, aber schauen Sie sich WSARecv an und Familie, und denken, dass sich die gesamte Sockets-API unter Windows von der Berkeley Sockets API unterscheidet?

Die Berkeley-API existiert unter Windows (siehe recv und Familie) ) und ist weitgehend kompatibel mit anderen Berkeley Sockets-Implementierung.

Siehe den MSDN-Artikel "Porting Socket-Anwendungen für Winsock" für Informationen über die Portierung von Sockets-Code nach Windows.

    
RichieHindle 08.08.2009, 23:36
quelle
17

Die Winsock-Programmierer-FAQ hat einen Abschnitt dazu, BSD Sockets-Kompatibilität . (Disclosure: Ich bin der Betreuer der FAQ.)

Ich habe das Warum und Warum in diesem Artikel nicht wirklich behandelt, also:

  • winsock.h gegen sys / socket.h, arpa / inet.h, netinet / in.h, etc. : Ich finde tatsächlich eine Verbesserung. Es ist alles eine enge Reihe von Funktionen, warum also nicht alle Definitionen dafür in einem einzigen Header haben?

  • close () vs. closesocket () : In Windows 3 Tagen, als Winsock erfunden wurde, hatten Windows C ++ - Compiler alle eine Art POSIX-API-Wrapper, um einige grundlegende Funktionen bereitzustellen Portabilität, einschließlich close (). Diese wurden nur in der stdio-Implementierung des Compilers aufgerufen, da DOS und Win16 keinen einheitlichen I / O-Mechanismus wie Unices haben. Man kann nicht einfach close () auf einen Deskriptor in Win16 aufrufen und es funktioniert unabhängig davon, ob es eine Datei, ein Socket, eine Pipe oder was auch immer ist. Win32 existierte zur selben Zeit, als Winsock als Teil von NT 3.5 erfunden wurde, und es behebt dies, aber Winsock nur für NT-Derivate verfügbar zu machen, hätte MS im Internet bis Windows XP irrelevant gemacht. MS kann langsam sein, aber nicht das langsam. Bottom Line, alles in BSD-Sockets, die POSIX-Mechanismen verwendet, die mit vorhandenen APIs kollidierten, die von den C ++ - Compilern zur Verfügung gestellt wurden, die darauf abzielten, konnten sich nicht in Winsock befinden. Sie mussten der gleichen Funktionalität einen neuen Namen geben.

  • WSA * () : Dies ist nur eine zusätzliche Funktionalität, die Funktionalität bietet, die BSD-Sockets nicht bietet. Vieles davon ist wirklich nett, und es wäre schön, ähnliche Mechanismen in allen Unis zu sehen, aber das wird in absehbarer Zeit nicht passieren. Es gibt konkurrierende Mechanismen wie aio * () , aber das ist nicht für alle Unices verfügbar, viel weniger für Windows. Sie können es einfach ignorieren und bleiben bei den Socket-APIs, obwohl dies nicht immer die beste Wahl ist, wenn Sie nach Windows portieren.

  • Fehlerno vs. WSAGetLastError () : Fehlernummer ist Teil von Standard C, aber die Fehlerwerte sind bis zur C-Implementierung. Denken Sie daran, dass Winsock am Anfang keine Microsoft-spezifische Sache war. DOS und Windows haben nicht mit Standard-Netzwerk-APIs begonnen. Dies wurde von Dritten zur Verfügung gestellt, die alle zusammen kamen und Winsock erfanden, an dem Microsoft beteiligt war. Die anfänglichen Winsock-Stapel waren alle von Drittanbietern. Sie konnten aus verschiedenen Gründen die Spezifikation nicht schreiben, um den errno-Wert des C RTL zu überschreiben. Diese Fehlerwerte gehörten zu der vom Hersteller bereitgestellten winsock.dll, eine ganz andere Welt als die C RTL.

  • WSAStartup (), WSACleanup () : Dies liegt wiederum an der Tatsache, dass winsock.dll anfänglich eine von Drittanbietern bereitgestellte Sache war, die mit einem zugrunde liegenden Netzwerkstack verbunden war Teil des Betriebssystems. Außerdem gibt es den Win16-Aspekt der Dinge: Win16 konnte nicht sehen, dass ein Programm gerade gestorben ist und seine zugewiesenen Ressourcen automatisch bereinigt. Sie mussten alles explizit freigeben, bevor das Programm beendet wurde, oder sie würden durchgesickert.

  • Mangel an readv (), etc. : Das ergab keinen Sinn in der Drittanbieter- / Win16-Welt, in der Winsock geboren wurde.

Warren Young 09.08.2009 00:39
quelle
0

Versuchen Sie ACE - es ist eine großartige plattformübergreifende Kommunikationsbibliothek.

    
Tim 08.08.2009 23:50
quelle
0
___ qstnhdr ___ Warum hat Microsoft Sockets anders implementiert? ___ answer1250170 ___

Versuchen Sie ACE - es ist eine großartige plattformübergreifende Kommunikationsbibliothek.

    
___ answer1250149 ___

Verzeihen Sie, wenn ich den Punkt verpasst habe, aber schauen Sie sich WSARecv an und Familie, und denken, dass sich die gesamte Sockets-API unter Windows von der Berkeley Sockets API unterscheidet?

Die Berkeley-API existiert unter Windows (siehe recv und Familie) ) und ist weitgehend kompatibel mit anderen Berkeley Sockets-Implementierung.

Siehe den MSDN-Artikel "Porting Socket-Anwendungen für Winsock" für Informationen über die Portierung von Sockets-Code nach Windows.

    
___ answer1250266 ___

Die Winsock-Programmierer-FAQ hat einen Abschnitt dazu, BSD Sockets-Kompatibilität . (Disclosure: Ich bin der Betreuer der FAQ.)

Ich habe das Warum und Warum in diesem Artikel nicht wirklich behandelt, also:

  • winsock.h gegen sys / socket.h, arpa / inet.h, netinet / in.h, etc. : Ich finde tatsächlich eine Verbesserung. Es ist alles eine enge Reihe von Funktionen, warum also nicht alle Definitionen dafür in einem einzigen Header haben?

  • close () vs. closesocket () : In Windows 3 Tagen, als Winsock erfunden wurde, hatten Windows C ++ - Compiler alle eine Art POSIX-API-Wrapper, um einige grundlegende Funktionen bereitzustellen Portabilität, einschließlich close (). Diese wurden nur in der stdio-Implementierung des Compilers aufgerufen, da DOS und Win16 keinen einheitlichen I / O-Mechanismus wie Unices haben. Man kann nicht einfach close () auf einen Deskriptor in Win16 aufrufen und es funktioniert unabhängig davon, ob es eine Datei, ein Socket, eine Pipe oder was auch immer ist. Win32 existierte zur selben Zeit, als Winsock als Teil von NT 3.5 erfunden wurde, und es behebt dies, aber Winsock nur für NT-Derivate verfügbar zu machen, hätte MS im Internet bis Windows XP irrelevant gemacht. MS kann langsam sein, aber nicht das langsam. Bottom Line, alles in BSD-Sockets, die POSIX-Mechanismen verwendet, die mit vorhandenen APIs kollidierten, die von den C ++ - Compilern zur Verfügung gestellt wurden, die darauf abzielten, konnten sich nicht in Winsock befinden. Sie mussten der gleichen Funktionalität einen neuen Namen geben.

  • WSA * () : Dies ist nur eine zusätzliche Funktionalität, die Funktionalität bietet, die BSD-Sockets nicht bietet. Vieles davon ist wirklich nett, und es wäre schön, ähnliche Mechanismen in allen Unis zu sehen, aber das wird in absehbarer Zeit nicht passieren. Es gibt konkurrierende Mechanismen wie aio * () , aber das ist nicht für alle Unices verfügbar, viel weniger für Windows. Sie können es einfach ignorieren und bleiben bei den Socket-APIs, obwohl dies nicht immer die beste Wahl ist, wenn Sie nach Windows portieren.

  • Fehlerno vs. WSAGetLastError () : Fehlernummer ist Teil von Standard C, aber die Fehlerwerte sind bis zur C-Implementierung. Denken Sie daran, dass Winsock am Anfang keine Microsoft-spezifische Sache war. DOS und Windows haben nicht mit Standard-Netzwerk-APIs begonnen. Dies wurde von Dritten zur Verfügung gestellt, die alle zusammen kamen und Winsock erfanden, an dem Microsoft beteiligt war. Die anfänglichen Winsock-Stapel waren alle von Drittanbietern. Sie konnten aus verschiedenen Gründen die Spezifikation nicht schreiben, um den errno-Wert des C RTL zu überschreiben. Diese Fehlerwerte gehörten zu der vom Hersteller bereitgestellten winsock.dll, eine ganz andere Welt als die C RTL.

  • WSAStartup (), WSACleanup () : Dies liegt wiederum an der Tatsache, dass winsock.dll anfänglich eine von Drittanbietern bereitgestellte Sache war, die mit einem zugrunde liegenden Netzwerkstack verbunden war Teil des Betriebssystems. Außerdem gibt es den Win16-Aspekt der Dinge: Win16 konnte nicht sehen, dass ein Programm gerade gestorben ist und seine zugewiesenen Ressourcen automatisch bereinigt. Sie mussten alles explizit freigeben, bevor das Programm beendet wurde, oder sie würden durchgesickert.

  • Mangel an readv (), etc. : Das ergab keinen Sinn in der Drittanbieter- / Win16-Welt, in der Winsock geboren wurde.

___ tag123networking ___ Für die meisten Programmierfragen verwenden Sie das [network-programming] -Tag. Nicht-programmierbare Netzwerkfragen sind nicht Thema und sollten stattdessen in Network Engineering, Super User oder Server Fault abgefragt werden. Dieses Tag eignet sich nur für Fragen zu speziellen Netzwerkanforderungen zur Unterstützung der Softwareentwicklung. ___ tag123winsock ___ Bei der Berechnung ist die Windows Sockets API (WSA), die später zu Winsock abgekürzt wurde, eine technische Spezifikation, die definiert, wie Windows-Netzwerksoftware auf Netzwerkdienste, insbesondere TCP / IP, zugreifen soll. ___ tag123sockets ___ Ein Endpunkt eines bidirektionalen Interprozess-Kommunikationsflusses. Dies bezieht sich oft auf einen Prozessablauf über eine Netzwerkverbindung, ist jedoch keineswegs darauf beschränkt. Nicht zu verwechseln mit Websocket (einem Protokoll) oder anderen Abstraktionen (z. B. socket.io). ___ qstntxt ___

Ich bin gerade mitten in einem Projekt mit Sockets, und ich benutze nur Linux sys / socket.h Datei. Rufen Sie Microsoft den Port zu und erkennen Sie, dass Winsock anders ist. Ich denke, ich habe zwei Fragen.

Erstens, was sind die Hauptunterschiede zwischen den beiden Implementierungen? Gibt es einen einfachen Weg, sie zu "übersetzen"? Ein Link zu einem Leitfaden würde sehr geschätzt werden, denn Sie können mir wahrscheinlich bessere Links als Google bekommen.

Zweitens, warum hat Microsoft das getan? Was war ihre Motivation? Warum haben sie nicht dieselbe Implementierung wie alle anderen beibehalten?

    
___ antwort1250200 ___

Milen hat das in einem Kommentar gesagt, aber die Apache Portable Runtime -Bibliothek deckt viele Probleme mit der Portabilität von Netzwerkanwendungen ab.

>     
___
Novelocrat 09.08.2009 00:00
quelle

Tags und Links