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:
Und sogar andere Ansätze. Ist es in Ordnung, nur die Größe von (sockaddr_un) - oder was ist der richtige Weg?
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.
Sie sollten SUN_LEN
macro verwenden. Hier ist von /usr/include/sys/un.h
auf meinem Mac:
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.