Freigeben über


Bytereihenfolge

Alle Unterschiede zwischen der Bytereihenfolge, die von der Hostarchitektur zum Speichern ganzer Zahlen verwendet wird, und der Bytereihenfolge, die von einzelnen Transportprotokollen für die Übertragung verwendet wird, müssen immer berücksichtigt werden. Jeder Verweis auf eine Adresse oder Portnummer, die an oder von einer Windows Sockets-Routine übergeben wird, muss sich in der Netzwerkreihenfolge (big-endian) für das verwendete Protokoll befinden. Im Fall von IP umfasst dies die IP-Adresse und portparameter einer sockaddr-Struktur (aber nicht den parameter sin_family ).

Eine Reihe der UNIX-Systeme arbeiten mit CPUs, die ganze Zahlen in Netzwerkbytereihenfolge (big-endian) darstellen. Daher kann die Notwendigkeit, ganze Zahlen von der Hostbytereihenfolge in die Netzwerkbytereihenfolge zu konvertieren, ignoriert werden, ohne Probleme zu verursachen, auch wenn dies für die Portabilität nicht empfohlen wird.

Im Gegensatz dazu ist die Bytereihenfolge, die von den meisten Intel-CPUs® verwendet wird, um ganze Zahlen darzustellen, Little-Endian. Daher ist es obligatorisch, dass ganze Zahlen von der Hostbytereihenfolge in die Netzwerkbytereihenfolge konvertiert werden, bevor sie in Winsock Sockets-Funktionen und -Strukturen verwendet werden.

Stellen Sie sich eine Anwendung vor, die normalerweise einen Server über den TCP-Port kontaktiert, der dem Zeitdienst entspricht, aber einen Mechanismus bereitstellt, mit dem der Benutzer einen alternativen Port angeben kann. Die von getservbyname zurückgegebene Portnummer befindet sich bereits in der Netzwerkreihenfolge. Dies ist das Format, das zum Erstellen einer Adresse erforderlich ist, sodass keine Übersetzung erforderlich ist. Wenn der Benutzer sich jedoch dafür entscheidet, einen anderen Port zu verwenden, der als ganze Zahl eingegeben wird, muss die Anwendung diesen vom Host in die TCP/IP-Netzwerkreihenfolge konvertieren (mit der htons- oder WSAHtons-Funktion ), bevor er zum Erstellen einer Adresse verwendet wird. Wenn die Anwendung hingegen die Nummer des Ports innerhalb einer Adresse anzeigen soll (z. B. von getpeername zurückgegeben), muss die Portnummer von Netzwerk- in Hostreihenfolge (mithilfe der Funktion ntohs oder WSANtohs ) konvertiert werden, bevor sie angezeigt werden kann.

Da die Intel- und Internet-Bytereihenfolgen unterschiedlich sind, sind die oben beschriebenen Konvertierungen unvermeidlich. Anwendungsautoren werden darauf hingewiesen, dass sie die standardmäßigen Konvertierungsfunktionen verwenden sollten, die als Teil von Winsock bereitgestellt werden, anstatt ihren eigenen Konvertierungscode zu schreiben, da zukünftige Implementierungen von Winsock wahrscheinlich auf Systemen ausgeführt werden, deren Hostreihenfolge mit der Netzwerkbytereihenfolge identisch ist. Nur Anwendungen, die die Standardkonvertierungsfunktionen zwischen Host- und Netzwerkbytereihenfolge verwenden, sind wahrscheinlich portierbar.

getpeername

getservbyname

htonl

htons

ntohl

ntohs

Portieren von Socketanwendungen zu Winsock

sockaddr

Überlegungen zur Winsock-Programmierung

WSAHtonl

WSAHtons

WSANtohl

WSANtohs