Korrekte Länge eines AF_UNIX-Sockets beim Aufruf von bind ()

8

bind () benötigt eine Länge der Sockaddr-Struktur, die Sie ihm gegeben haben. Jetzt wird für Unix-Sockets sockaddr_un verwendet

Wie lässt sich die Länge dieser Option berechnen, wenn Sie das sun_path -Member ausgefüllt haben? Ich habe mehrere Ansätze gesehen:

%Vor%

Und sogar andere Ansätze. Ist es in Ordnung, nur die Größe von (sockaddr_un) - oder was ist der richtige Weg?

    
nos 21.02.2010, 21:24
quelle

2 Antworten

3

sizeof(struct sockaddr_un) ist in Ordnung.

Schauen Sie sich die Manpage unix(7) an. Das Feld sun_path ist ein Zeichen-Array, das Teil der Struktur ist.

    
Stéphan Kochen 21.02.2010, 21:29
quelle
9

Sie sollten SUN_LEN macro verwenden. Hier ist von /usr/include/sys/un.h auf meinem Mac:

%Vor%

Bearbeiten:

Ja, es ist nicht portabel und nicht POSIX, aber wir arbeiten an echten Plattformen, nicht wahr?

Die Sache ist, dass Sie den Pfad auf Null setzen müssen und der obige Code so gut wie sizeof( struct sockaddr_un ) ist, aber Sie könnten ein paar Bytes beim Kopieren vom Benutzer zum Kernel sparen, aber ein paar Zyklen in strlen / p>

Sehen Sie sich an, wie Linux diese Länge verarbeitet (aus Ссылка ) :

%Vor%

Hier ist len direkt vom dritten Argument zum bind Systemaufruf, aber sunaddr wurde bereits in den Kernelraum mit dieser Länge kopiert. Sie können die Adresse nicht länger haben als sizeof( sockadd_un ) . Kernel tut das strlen trotzdem.

Also ja,% ccode% ist wahrscheinlich auf der ganzen Linie sicherer, aber die Kernel-genaue Länge zu sagen tut auch nicht weh.

    
Nikolai Fetissov 21.02.2010 21:34
quelle

Tags und Links