2012-01-02 13 views
2

私は、次の後に「バッファ」に格納されたデータ構造を把握しようとしている:C PF_PACKETリンク層処理

sock=socket(PF_PACKET, SOCK_RAW, htons(ETHERTYPE_IP));

recvfrom(sock, buffer, 2048, 0, NULL, NULL);

私はなりたいですデータ構造を突き刺し、リンク層、IP層、およびTCP層がTCPパケットであればそれを読み取ることができます。私はマニュアルページといくつかのヘッダーファイルを試しましたが、ちょうどその場所にあります。

ありがとうございます。

答えて

3

これは、ワイヤ(OSIレイヤ2)を通過する生ビットです。 man page for packetはそれをかなりうまく説明します。

私はこれを出力して、同じデータを見ているWiresharkセッションの出力と比較します。あなたはその2つを相関させ、何が起こっているかを見ることができるはずです。

+0

私は男7のパケットを見ました。マニュアルページに基づいて、「リンクレベルヘッダー情報は、sockaddr_llの共通フォーマットで利用可能です。」と記載されています。 sockaddr_llを見ると、構造体にIPパケット全体を入れることができないことがわかります。 – Philoxopher

+1

sockaddr_llにはパケット全体ではなく、リンクレベル*ヘッダ*情報だけが含まれています。他のデータはあなたのrecvバッファにあります。形式は、送信するプロトコルによって異なります。適切なプロトコルのRFCを見てください。 IP、TCPなど。 – mark4o

+0

マニュアルページの一番上を見ると、#includeには、低レベルのパケットを定義するヘッダファイルがあります(ただし、構造体ではありませんが、定義しています)。 sockaddr_llは単にアドレスを定義します。 –