2016-03-20 9 views
1

Wenn ich Beispiele für Htonl nachschlagen, gibt es immer eine uint32_t. Wenn ich htotl in VS2015 mit Winsock2.h aufrufen, wird jedoch eine u_long zurückgegeben.Verwendung von htonl/ntohl auf einer 32-Bit-Ganzzahl, die über einen Socket gesendet wird

Auf meinem Computer, wenn ich für 32 Bit und für 64 Bit kompiliere, bekomme ich, dass die Größe eines u_long 4 Bytes ist. Ich habe online gelesen, dass in einer 64-Bit-Architektur ein Long 8 Bytes sein sollte. Wird dies jemals der Fall sein? Ich bin besorgt, dass ich Kompatibilitätsprobleme haben werde, wenn ein u_long nicht die gleiche Menge an Bytes wie uint32_t ist, wenn die Daten über den Socket gesendet werden sollen.

TL; DR - Wird eine u_long immer 4 Bytes lang sein? Wenn nicht, wie sollten Sie zuverlässig eine 32-Bit-Ganzzahl über einen Socket senden?

Antwort

1

u_long ist ein typedef zu unsigned long, lange wiederum ist garantiert, mindestens 32 Bit zu sein - das ist mindestens 4 Bytes. Auf manchen Systemen ist es vielleicht größer - aber es gibt wirklich keine Möglichkeit, dies vorher zu wissen.

Wenn Sie also Netzwerkkommunikation durchführen und Ganzzahlen senden möchten, die größer als ein Byte sind, müssen Sie darauf achten, die Größe selbst zu beschränken. Senden Sie nicht einfach sizeof Bytes, beschränken Sie es auf vier Bytes.

Auch beim Umgang mit Ganzzahlen haben Sie die Frage, welche Byte-Reihenfolge zum Senden/Empfangen der Daten verwendet wird. Wenn Sie auf beiden Seiten das gleiche Betriebssystem haben, ist das kein Problem - aber wenn Sie beispielsweise zwischen Windows und Linux wechseln, könnte es sein.

Verwandte Themen