0

libpcap を使用して PPP インターフェイスからデータをキャプチャし、次のようにフィルターを追加しています。

char filter_exp[] = "ip";   

しかし、コールバック関数でパケットを盗聴すると、ip パケットの形式が

不正解です。ヘッダー サイズが 20 バイトではありません。

そして、eth0 からパケットをキャプチャすると、すべて正常です。

では、libpcap を使用して PPP インターフェースから正しい IP パケットを取得する方法を誰が教えてくれますか?

4

2 に答える 2

2

しかし、コールバック関数でパケットを盗聴すると、ip パケットの形式が正しくないことがわかりました。ヘッダー サイズは 20 バイトではありません。

あなたのコールバック関数は でのpcap_datalink()呼び出しの結果を使用してpcap_t、パケットを解析する方法を決定しています。または、 の結果に応じて異なるコールバック関数を指定していますpcap_datalink()よね?

そうでない場合は、おそらく、パケットに特定のリンク層ヘッダー タイプがあると想定している可能性がありますが、これは常に間違ったことです。

PPP パケットは、必ずしもイーサネット パケットと同じリンク層ヘッダー タイプを持つとは限りません (ただし、WinPcap を使用する Windows では、同じリンク層ヘッダー タイプを持つ可能性があります!)。また、PPP ヘッダーがない場合もあります。特に、Linux では、少なくとも 1 つの時点で、カーネルが PPP ヘッダーを取り除き、リンク層ヘッダーを提供しないため、 Linux でクックされたキャプチャ ヘッダーを持ちます。ネットワーク層のプロトコル タイプを取得できます。 これを示すために、Linux の PPP デバイスに対してではなくを返します。pcap_datalink()DLT_LINUX_SLLDLT_PPP

于 2013-08-05T18:35:22.343 に答える
0

PPP と IP はまったく異なるプロトコルです。PPP を介して IP データグラムを転送する場合は、IP パケットをペイロードとして PPP ヘッダーにラップします。IP パケットにする前に、パケットから PPP 情報を取り除く必要があります。

于 2010-11-23T06:40:13.057 に答える