0

これは私がかなり前から解決しようとしてきた質問です。これは特定の言語を実現しませんが、エンディアンを指定するVMを持っている人にとっては実際には有益ではありません。ソケットを使用してTCP/IPを使用してデータを送信する99.9999%の人のように、プロトコルが宛先アドレスやポートなどの送信要素のエンディアンを指定していることを私は知っています。私が知らないのは、非互換性を防ぐためにペイロードを特定の形式にする必要があるかどうかです

たとえば、プレゼンテーション層ではないプロトコルを開発し、最近のリトルエンディアンデバイスの優位性が非常に高いため、リトルエンディアンにすることにしたとします(たとえば、プレーヤーの位置などが送信されます)。リトルエンディアン順)。たとえば、ゲームエンジンのネットワークモジュールでは、レイテンシが重要であり、バイト変換にはかなりの時間がかかります。もちろん、アドレス、ポート、およびプロトコルに関連するすべてのデータは、必須としてビッグエンディアンで指定されます。ペイロードについて話しているのはそれだけです。

そのプロトコルは、ビッグエンディアンのマシンですぐに機能しますか(もちろん、送信が受信されたら、必要に応じて内容を変換します)?または、データの順序が異なるため、IPプロトコルなどのチェックサムが誤って計算され、raw_socketsが使用されていない場合、プログラマーはそれらを制御できませんか?

説明全体が誤解を招く可能性があるため、お気軽に説明を求めてください。

どうもありがとうございます。

4

2 に答える 2

5

私が知らないのは、非互換性を防ぐためにペイロードを特定の形式にする必要があるかどうかです。

そうではなく、それを伝える方法もありません。TCPにとって、それは単なるバイトストリームです。エンディアンを決定するのはアプリケーションプロトコル次第であり、それを正しく実装するのは各エンドの実装者次第です。ビッグエンディアンを使用する規則がありますが、強制はありません。

于 2013-02-12T23:07:02.430 に答える
1

アプリケーション層プロトコルは、独自のエンディアンを決定します。ただし、慣例により、プラットフォームが提供する(ホストからネットワーク)および(ネットワークからホスト)関数を使用するなどして、プラットフォーム間で一貫性を保つために、マルチバイト整数値をネットワークバイト順(ビッグエンディアン)で送信する必要があります。コード内の実装。リトルエンディアンシステムでは、必要なバイトスワッピングを実行します。ビッグエンディアンシステムでは、これらはノーオペレーションです。関数は抽象化レイヤーを提供するため、コードはそれについて心配する必要はありません。hton...()ntoh...()

于 2013-02-12T23:13:49.897 に答える