Cross-Platform Kompatibilität von socket.getpeername

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Guten Abend.

Ich bin heute über folgenden kleinen, aber sehr schwerwiegenden Satz in der Dokumentation zu socket.getpeername gestoßen: „On some systems this function is not supported.” Da dieser Satz, aufgrund seiner Wortkargheit, kaum bis gar nicht hilfreich ist, habe ich beschlossen, der Sache auf den Grund zu gehen. Leider waren diese Versuche mit wenig Erfolg gesegnet, unter anderem ob einer scheinbaren Inkonsistenz in der Python Dokumentation.

Ich habe also die Linux-Manpage zu getpeername zu Gemüte geführt, in welcher den für meine Frage entscheidende Abschnitt wohl „CONFORMING TO; SVr4, 4.4BSD (the getpeername() function call first appeared in 4.2BSD), POSIX.1-2001.” darstellt. Verweist die Dokumentation also auf Systeme, die vor obengennanten Standards erschienen sind? Und wenn ja: Weshalb gibt es in der Python Dokumentation zu getsockname keinen Vermerk über die Kompatibilität, wo doch der „CONFORMING TO” Abschnitt identisch zu dem getpeernames ist? Eventuell ist noch „The third argument of getpeername() is in reality an int * (and this is what 4.x BSD and libc4 and libc5 have). Some POSIX confusion resulted in the present socklen_t, also used by glibc. See also accept(2).” von Bedeutung, welches jedoch ebenso in beiden Manpages zu finden ist.

Ich hoffe, dass jemand ein Bisschen Klarheit in die Angelegenheit bringen kann.

Danke.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
lunar

@name: Die Python-Dokumentation gibt wieder, wie Python sich verhält. Mit den Handbuchseiten der C-Funktionen und den darin erwähnten Standards hat das nur mittelbar zu tun. Insofern ist es primär vollkommen egal, dass beide Funktionen durch die selben Standards definiert werden, denn im Bezug auf CPython gibt es durchaus einen Unterschied zwischen "getsockname()" und "getpeername()".

Die Existenz von "getsockname()" wird stillschweigend vorausgesetzt. Fehlt diese Funktion (was in der Realität wohl nie vorkommt), schlägt die Kompilierung des "socket"-Moduls und in Konsequenz auch die Kompilierung der CPython-Standardbibliothek fehl. Die Existenz von "getpeername()" dagegen wird durch das Buildsystem von CPython explizit geprüft (siehe "configure.in"). Fehlt "getpeername()", dann wird das "socket"-Modul eben ohne gebaut, aber die Kompilierung selbst ist erfolgreich. Dementsprechend kann es nie sein, dass in einem vollständigen und korrekt kompilierten CPython "getsockname()" fehlt, wohl aber, dass "getpeername()" nicht vorhanden ist. Insofern ist die Anmerkung in der Dokumentation von "getpeername()" vollauf korrekt, sie ergibt sich direkt aus der Art wie CPython kompiliert wird.

Dem Quelltext von "socket" zufolge (Modules/socketmodule.c, r87243, Zeile 2185) fehlt "getpeername()" beispielsweise auf Cray APP-Systemen. Keine Ahnung, was das für Systeme sind, und ob die überhaupt noch produktiv eingesetzt werden, aber offenbar ist in der Vergangenheit mal jemand darüber gestolpert und hat das "socket"-Modul entsprechend angepasst.

Was die in der Handbuchseite erwähnten Standards angeht: Das bedeutet nur, dass diese Funktion in der dokumentierten Form garantiert auf allen Systemen vorhanden ist, die einen dieser Standards vollständig umsetzen. Nicht mehr, und nicht weniger.

Es gibt nun aber eine Vielzahl von (semi-)offiziellen Unix-Standards, und einen ungeheuren Wildwuchs an Implementierungen, die verschiedene dieser Standards manchmal ganz, manchmal gar nicht und oft genug nur unvollständig umsetzen. Insofern kann die Funktion durchaus auch auf Systemen vorhanden sein, die diese Standards nicht vollständig implementieren. Anders gesagt gibt es bestimmt diverse Unix-Varianten, die weder kompatibel zu System V noch zu 4.4BSD und erst recht nicht zu POSIX 2001 sind, und trotzdem "getsockname()" anbieten.

Und offenbar ist "getsockname()" eben auf allen Systemen vorhanden, auf denen man je versucht hat, CPython zu übersetzen, während das für "getpeername()" anscheinend nicht gilt, da hat wohl jemand einmal die gegenteilige Erfahrung gemacht.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Danke sehr!

+rep

So hätte ich es gerne in der Python Dokumentation erklärt :-)
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
lunar

Use the source, luke ... so habe ich das schließlich auch herausgefunden ;)
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

lunar hat geschrieben:Use the source, luke ... so habe ich das schließlich auch herausgefunden ;)
Ja, habe ich mir auch gedacht, dass ich das verabsäumt habe, wie ich deine Antwort gelesen habe. Aber das ist nicht ja nicht Sinn der Doku :)
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
lunar

@name: Naja, warum sollte das in der Dokumentation stehen? Anders gesagt: Weißt Du jetzt wirklich mehr als vorher, im Bezug auf Deinen Quelltext?
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

lunar hat geschrieben:@name: Naja, warum sollte das in der Dokumentation stehen? Anders gesagt: Weißt Du jetzt wirklich mehr als vorher, im Bezug auf Deinen Quelltext?
Ja, weiß ich.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
lunar

@name: Und was wäre das genau?

Ich meine, Du wusstest vorher aus der Dokumentation und durch die in den Handbuchseiten aufgeführten Standards, dass "getpeername()" auf allen einigermaßen modernen Systemen vorhanden ist, auf einigen älteren, eher obskuren Systemen aber fehlen kann. Welche Systeme tatsächlich davon betroffen sind, weißt Du aber auch nach meinem Beitrag ebenso wenig wie eine alternative Funktion für den Fall, dass "getpeername()" tatsächlich fehlt. Vielleicht hast Du nun auch festgestellt, dass Handbuchseiten zu C-Funktionen nicht unbedingt mit der Python-Dokumentation korrelieren, aber das hätte Dir eigentlich auch vorher bewusst sein müssen, denn schließlich sind die Python-Standardbibliothek und irgendwelche C-Bibliotheken ganz grundsätzlich erst einmal vollkommen verschiedene Dinge.

Was also hat Dir mein Beitrag jetzt jenseits von Hintergrundwissen über Unix und CPython konkret für Deinen Quelltext, bei dem dieses Problem aufgetaucht ist, gebracht?

Davon abgesehen gehören Erläuterungen zu den verschiedenen Unix-Standards auch eigentlich nicht in Dokumentation von Python.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

lunar hat geschrieben:@name: Und was wäre das genau?

Ich meine, Du wusstest vorher aus der Dokumentation und durch die in den Handbuchseiten aufgeführten Standards, dass "getpeername()" auf allen einigermaßen modernen Systemen vorhanden ist, auf einigen älteren, eher obskuren Systemen aber fehlen kann. Welche Systeme tatsächlich davon betroffen sind, weißt Du aber auch nach meinem Beitrag ebenso wenig wie eine alternative Funktion für den Fall, dass "getpeername()" tatsächlich fehlt. Vielleicht hast Du nun auch festgestellt, dass Handbuchseiten zu C-Funktionen nicht unbedingt mit der Python-Dokumentation korrelieren, aber das hätte Dir eigentlich auch vorher bewusst sein müssen, denn schließlich sind die Python-Standardbibliothek und irgendwelche C-Bibliotheken ganz grundsätzlich erst einmal vollkommen verschiedene Dinge.

Was also hat Dir mein Beitrag jetzt jenseits von Hintergrundwissen über Unix und CPython konkret für Deinen Quelltext, bei dem dieses Problem aufgetaucht ist, gebracht?

Davon abgesehen gehören Erläuterungen zu den verschiedenen Unix-Standards auch eigentlich nicht in Dokumentation von Python.
Ich weiß jetzt, dass mit "not supported" "not available" gemeint ist.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Antworten