2011-06-30 12 views
3

C++では、ネットワーク上のソケットを使用してデータを送信します。私たちは、バイトオーダービッグエンディアンリトルエンディアンを維持するためにhtons()ntohs()機能を使用する必要があることを承知しています。我々はまた、これは構造体にラップすることができC++ソケットプログラミングのバイトオーダー

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

を送信するデータを以下のいる

サポート。ここ

私の混乱は、我々がhtons()機能を使用することができ、ロールIDのために、です。しかし、文字列の名前がの場合、どうすればいいですか?そのような機能を使用する必要がありますか? Mac、Intel、その他のネットワークのようなすべてのマシンで動作しますか?

1つのパケットに3つのフィールドをすべて送信したいとします。

答えて

6

intで、htonsではありません。

配列のバイトがネットワーク上のバイトに直接対応するため、名前の順序を変更する必要はありません。

バイトオーダーの問題は、異なるアーキテクチャーが最下位バイトを配置する異なる端を選択するため、バイトより大きなワードでのみ発生します。

+1

@Vijay:あなたは何をしているのか分かりません。 –

+0

@marcelo:おそらくマルチバイト文字ですか? 0x0001は0x0100になりますか? – Donotalo

+0

あなたが正しいとMarcelo Cantosが似ています。もう少し情報が必要です。ありがとうございます – Vijay

1

char配列の場合、ネットワークバイトオーダーを持たずに連続して送信されるため、この変換は不要です。 ntohshtonsが存在する理由は、いくつかのデータ型は、より小さいビットとより重要なビットとで構成され、異なるアーキテクチャでは異なる解釈をするからです。これは文字列には当てはまりません。

+0

実際には、問題となっているバイトオーダリングのためです。 – diverscuba23

+1

あなたは文字列ですか?いいえ、それはなぜでしょうか? – Constantinius

+0

私はntohsとhtonsとその関連する機能を指していました。ホストバイトオーダーがネットワークバイトオーダーと異なる場合は、各バイト内のビットの並べ替えを行わず、単にバイトオーダーをスワップします。 – diverscuba23

0

あなたの構造体がもっと複​​雑になる場合は、カバー下のエンディアンを扱うBoost.SerializationまたはGoogle Protocol Buffersのようなシリアライゼーションライブラリを考えると、より良い結果が得られます。

文字列をエンコードするときは、文字列自体の前に長さ(おそらくshortが扱われます)を送信してください。たびに100文字を送信しないでください。

関連する問題