1

int socket(int domain, int type, int protocol);APIのドキュメントには、特定のドメインに複数のプロトコルが存在する場合、プロトコルは特定のプロトコルを指定すると記載されています。これは、特定のソケットの特定のドメインに対して1つのプロトコルしか指定できないことを意味しているようです。

Linuxでrawソケットを試していましたが、このプロトコルに出くわしました。私は、pcapライブラリを使用して任意のプロトコルのパケットをキャプチャできることを知っています。pcapを使用してQ&Dプログラムを作成しましたが、if_ether.hファイルで定義されているほとんどの一般的なプロトコルがキャプチャされていることに気付きました。

そのため、現在私のプログラムでは、キャプチャするパケットのタイプを1つしか指定できません。標準のLinuxヘッダーとライブラリを使用してpcapの動作を複製する方法はありますか?pcapはどのようにそれを達成しますか?質問をグーグルで検索しようとしましたが、返された結果があまり役に立たなかったため、クエリの形式が正しくなかったと思います。

私はここで何も解決しようとはしていません。概念を学ぶだけです。

4

1 に答える 1

2

Linuxでは、2.0以降のカーネルを使用すると、libpcapは、、、のいずれか、またはのいずれかであるdomainソケットでキャプチャします。PF_PACKETtypeSOCK_RAWSOCK_DGRAMprotocolhtons(ETH_P_ALL)

SOCK_RAWほとんどのネットワークインターフェイスでは、リンク層ヘッダー付きのパケットを提供します。PPPインターフェースなど、他のいくつかのインターフェースでは、リンク層ヘッダーのないパケットが提供されるため、リンク層プロトコルの上で実行されているプロトコルを判別するのが困難になります。

SOCK_DGRAMリンク層ヘッダーなしでパケットを提供しますが、いくつかの追加情報があります。libpcapはその情報を使用して、偽のリンク層ヘッダーを生成します。その追加情報を処理するには、独自のコードを作成する必要があります。

詳細については、Linuxのpacket(7)のマニュアルページを参照してください。

于 2012-04-19T07:03:57.963 に答える