我無法理解「網絡字節順序」的概念。我已閱讀Network byte order and endianness issues,但仍不能。
現在我通過TCP套接字爲兩臺計算機之間的通信制定了正式的網絡協議描述。這裏是短語「...使用little-endian字節順序」。但標準的網絡字節順序是big-endian。我應該考慮網絡字節順序嗎?
是否應該考慮一個字節順序,如果在網絡兩邊的字節順序是完全定義的,而且我寫了,大致說來,void*
和size
?網絡如何「知道」我的數據?浮動類型呢?
例如,是否我不能在我的側寫:
stream.setDevice(tcpSocket);
stream.setByteOrder(QDataStream::LittleEndian);
...
struct SomeType
{
int32_t a;
int32_t b;
double c;
friend QDataStream& operator << (
QDataStream& stream, const SomeType& x)
{
stream << x.a
<< x.b
<< x.c;
return stream;
}
};
或可能只是:
SomeType x;
tcpSocket.write(&x, size); // If known a byte order and a data structure alignment on both sides
計算機中的「網絡」或網絡堆棧並不知道您傳輸的數據,它只是來回傳遞二進制blob序列。當你必須將數據解釋成你的程序可以處理的東西時,麻煩來自你的程序。如果一個big-endian系統發送一個未修改的int到另一個恰好是little-endian的系統,那麼接收者會認爲接收到的int值是不是被髮送的。 –
@Someprogrammerdude,我能否在我的例子中不考慮這個問題(如果知道主機端的字節順序和數據結構對齊)? –
@VladimirBershov你可以但有一天這個錯誤將是一個問題。在任何情況下,您都會看到使用壓縮成幀協議的性能和維護優勢。谷歌的協議緩衝區就是這樣一個免費提供的協議。 –