2009-11-05 75 views
9

當我發送一個整數變量從一個進程到其他通過套接字,然後打印接收端的值,該值仍然是相同的,而不使用ntohl/htonl,然後在哪裏做我需要使用這些函數,而不是初始化套接字結構。我明白litte/big endian。但是,當值保持不變時,爲什麼我們需要將端口和IP nos轉換爲主機/網絡字節順序。請詳細解釋整數如何通過網絡傳輸?混亂htons-小端/大端

回答

16

如果你希望你的程序可以移植,那麼任何時候你的規模在網絡上發送一個整數大於1個字節,必須首先將其轉換使用htonshtonl網絡字節順序,並接收計算機必須轉換它使用ntohsntohl來承載字節順序。

在你的情況下,值仍然相同的原因可能是因爲發送計算機和接收計算機具有相同的字節順序。換句話說,你正在使用的發送計算機和接收計算機都是小端(或大端,無論情況如何)。

但是,如果你希望你的程序是可移植的,你不能依靠這種情況總是如此。例如,有一天,發送計算機可能是Intel x86,接收方可能是Sun SPARC,如果您不使用htons,則程序將失敗。

+0

我寫了客戶端和服務器,並沒有使用htonl和ntohl。說我送6時,服務器收到6個值。那麼這些功能的需求是什麼? – avd 2009-11-05 05:23:43

+5

這些功能的需求是在客戶端運行在小端計算機上,而服務器運行在大端時,或反之亦然。 – 2009-11-05 05:26:09

+0

非整數數據類型如結構體怎麼樣?他們有沒有頭緒? – 2014-02-24 05:13:51

9

如果您想要將數據從x86或amd64機器發送到使用PowerPC處理器的機器,採用二進制格式,您將很快看到數據遇到「NUXI問題」,因爲不同的處理器處理整數不同並且似乎交換字節。 (它們實際上不交換字節 - 它們只是以不同的順序與它們一起工作)。

當在x86或amd64上工作時,最不重要的字節在內存中首先出現(這樣,您可以執行從降低到更高的內存地址)。 PowerPC首先在內存中放置最重要的字節(這樣您可以根據內存中較早出現的字節對數字進行排序 - 字符串排序和整數排序可以完全相同)。

0

它重新生成因爲在您的體系結構中,網絡順序與本機順序相同。如果你從不期望爲另一個架構編譯你的代碼,你可以省略hton/ntoh調用。那麼你的代碼將不可移植。

+1

這是不正確的。他可能會使用主機訂單與網絡訂單不同的架構。只要兩個端點的體系結構具有相同的端點,您的代碼就可以在沒有htonX/ntohX的情況下「運行」。 – 2009-11-05 06:39:33

+0

你是對的 - 我打算說這樣的話,但我的回答並不是很清楚。 – 2009-11-05 16:03:22