"ネットワークバイトオーダー"の概念を理解できません。私はNetwork byte order and endianness issuesを読みましたが、それでもできません。
今、私はTCPソケットを介して2台のコンピュータ間の通信のための正式なネットワークプロトコル記述を作成しました。ここでは「...リトルエンディアンのバイトオーダーを使用する」というフレーズがあります。しかし、標準のネットワークバイトオーダーはビッグエンディアンです。ネットワークバイトオーダーについて考えるべきですか?
ネットワークの両側でバイトオーダーが完全に定義されていて、おおよその文字列が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
コンピュータのネットワークまたはネットワークスタックは、送信するデータについて何も知らず、バイナリブロブのシーケンスを前後に渡すだけです。この問題は、あなたのプログラムが扱うことができるものにデータを解釈する必要があるとき*あなたのプログラムにあります。ビッグエンディアンシステムがリトルエンディアンである別のシステムに変更されていない 'int 'を送信した場合、受信者は受け取った' int'値が送信されたもの以外であると考えます。 –
@Someprogrammerdude、私の例ではこれについて考えることはできませんか(バイトオーダーと両方のホスト側のデータ構造の整列が分かっていれば)? –
@VladimirBershovすることはできますが、このミスは問題になります。いずれにしても、圧縮されたフレーミングプロトコルを使用すると、パフォーマンスとメンテナンスのメリットが得られます。 Googleのプロトコルバッファは、自由に利用できるプロトコルの1つです。 –