2013-10-25 86 views
1

我不知道是否有任何旅行或跌倒就發送兩個輪空整體或字節數組。發送兩個字節用C與TCP

說我要送uint16_t。到底要送兩個字節數組像uint8_t[2]或者只是一次發送16位?

回答

1

你需要記住的主要事情是endianness。也就是說,在不同的平臺上,解釋字節的順序是不同的。

例如,英特爾的CPU可能會解釋字節串0x01 0x00是1號,但別人的PowerPC將其解釋字節該字符串是數256

當建立一個網絡協議,這一點很重要記住這樣的問題。 (你可能看起來像Google Protocol Buffers,這是爲了解決這個問題)

由於你只是談論兩個字節,你還應該看看htons()宏。這將從主機順序網絡順序的2字節的值。 (網絡命令是big endian,而主機命令通常是little endian,但在大端平臺htons()可以簡單地定義爲no-op。)如果要發送4字節(32位)值,你還應該看看htonl()宏。 htons代表主機到網絡短路,並會將您的16字節值轉換爲等效網絡指令 16位值(如果您在Intel CPU上,則表示它將返回16位版本整數與字節交換)。當你有傳入字節時,你的代碼應該使用ntohs(和ntohl,對於32位值)宏來將傳入數據從網絡字節順序轉換回主機順序。

0

此外,您顯然希望使用單個套接字寫入操作發送兩個字節。不要寫一個字節,然後使用兩個寫入寫另一個字節,因爲這可能最終導致線路效率低下。也就是說,不要寫uint8_t [0],後跟uint8_t [1]。寫& uint16_t會避免這種情況。