2011-06-30 76 views
3

在C++中,我們使用網絡套接字發送數據。我知道,我們需要使用htons()還有ntohs()函數保持字節順序大端小尾數。我們下面的數據C++在套接字編程中的字節順序

支持發送

int roll; 
int id; 
char name[100]; 

這也可以被包裝成結構。

我在這裏的混亂,對於ID,我們可以使用htons()功能。但對於字符串名稱,我們應該怎樣做?我們是否需要使用這些功能?它可以在Mac,Intel和其他網絡上運行嗎?

我想發送一個數據包中的所有三個字段。

回答

6

你會使用htonlint而不是htons

該名稱不需要重新排序,因爲該數組的字節直接對應於網絡上的字節。

字節順序的問題僅出現在大於一個字節的字上,因爲不同的體系結構選擇放置最低有效字節的不同端。

+1

@Vijay:我不知道你在做什麼。 –

+0

@marcelo:可能是多字節字符? 0x0001變成0x0100? – Donotalo

+0

馬塞洛坎託斯看起來像你是對的。需要一些更多的信息。謝謝 – Vijay

1

對於char數組,這種轉換不是必須的,因爲它們沒有網絡字節順序,但是被順序發送。存在ntohshtons的原因是,一些數據類型由較小和較重要的位組成,這些位在不同的體系結構上被不同地解釋。字符串中不是這種情況。

+0

實際上,對於那些字節排序的問題。 – diverscuba23

+1

你的意思是字符串?不,爲什麼要這樣? – Constantinius

+0

我指的是ntohs和htons及其相關的功能。如果主機字節順序與網絡字節順序不同,則不要重新排列每個字節中的位,只是交換字節順序。 – diverscuba23

0

要添加到有用的評論在這裏 - 如果你的結構變得更加複雜,你可以考慮一個序列化庫,比如Boost.SerializationGoogle Protocol Buffers,它們會在你的封面下處理字節序列。

編碼字符串時,請確保在字符串本身之前發送長度(可能是short使用htons處理),不要每次發送100個字符。