6

(質問を正しく言えなかったらすみません。英語は私の母国語ではありません。)

SyncE ESMC パケットを解析しようとしています。イーサネットの低速プロトコル パケットです。

アプローチ 1: このパケットを解析するために、ここで行われたのと同様のバイト単位のアプローチを使用しました。

アプローチ 2: パケットを解析する他の方法は、パケット全体を表す「構造」を定義し、個々のフィールドにアクセスして特定のオフセットの値を取得することです。ただし、このアプローチでは、構造のパディングとアラインメントが明らかになる可能性がありますが (これはよくわかりません)、Linux ではさまざまなパケット ヘッダーが構造の形式で定義されます (例: ip.h の iphdr)。IP パケット (バッファー) は、IP ヘッダー フィールドを取得するために「iphdr」にタイプ キャストできるため、動作している必要があります。

C でネットワーク パケットを解析するには、どのアプローチが適していますか?

アプローチ2でパケットを解析する際に、構造のパディングとアラインメントに違いはありますか? はいの場合、Linux ヘッダーはこの問題をどのように解決しましたか?

4

1 に答える 1

1

アプローチ 1 は移植性に最適です。たとえば、位置合わせされていないアクセスを安全に回避できます。特に、マシンがリトルエンディアンの場合、このアプローチにより、バイト交換を非常に簡単に処理できます。

アプローチ 2 は便利な場合もあり、多くの場合、より高速なコードを記述できます。構造体のパディングが邪魔になる場合、コンパイラはおそらくそれを回避するためのフラグまたは属性 (__attribute__((__packed__))または など) を提供します。#pragma packただし、リトル エンディアンのマシンを使用している場合でも、あちこちでフィールドをバイトスワップする必要があります。

于 2013-01-31T19:58:59.150 に答える