2016-03-20 41 views
1

當我查找htonl的示例時,它總是返回一個uint32_t。但是,當我使用Winsock2.h在VS2015中調用htonl時,它將返回u_long在將通過套接字發送的32位整數上使用htonl/ntohl

在我的機器上,當我編譯32位和64位時,我得到一個u_long的大小是4個字節。我在線閱讀,在64位體系結構中,長度應該是8個字節。這會永遠如此嗎?我擔心如果u_long與uint32_t的字節數量不同,當數據通過套接字發送時,我會遇到兼容性問題。

TL; DR - u_long是否總是4個字節?如果不是,您應該如何可靠地通過套接字發送32位整數?

回答

1

u_longtypedefunsigned long,反過來(或應該)保證至少32位 - 即至少4個字節。在某些系統上它可能更大 - 但事先沒有辦法知道。

因此,當您進行網絡通信並且想要發送大於一個字節的整數時,您必須注意自己限制大小。不要只發送sizeof字節,將其限制爲四個字節。

另外,當處理整數時,你有什麼字節順序用於發送/接收數據的小問題。 如果你有兩個相同的操作系統,這不會是一個問題 - 但如果你在Windows和Linux之間切換,例如,它可能是。