2017-01-16 15 views
0

Linuxではソケットからイーサネットパケットを受信したいが、2つのカスタムEthtype値のいずれかを持つものだけを受信したい。 のみ1 ethtypeが受信されなければならない場合、私は、知っているように、このCで複数のEthtypeを持つLinuxでイーサネットパケットを受信

int socket = socket(PF_PACKET, SOCK_RAW, htons(ETHERTYPE_CUSTOM_1); 

しかし、どのような場合、私は2つの異なるethtypesを持っているようにソケットを作成しながら、それはこの値を指定することができますか?私は2つのソケットを使用するか、いくつかのカスタムフィルタを書く必要がありますか?それとも単純な方法がありますか?

+1

私は2つのソケットを使用しています。つまり、システムが受け取るすべてのパケットに対してコードが実行されず、ほとんどのパケットが除外されます。 – Barmar

+0

また、すべてをキャプチャしてBPFプログラムをインストールするためのソケットを1つ使用することも考えられます。確かに、libpcapを使って、Linux上でカーネルにBPFをインストールする方法を知っている 'pcap_setfilter'関数を利用するだけです。 'link'指示文では、比較を行うリンクヘッダに適切なフィールドを指定することができます。 –

+0

@Barmarあなたは答えとしてコメントを追加してください – user3237732

答えて

1

ethertypeごとに1つずつ、2つのソケットを作成します。次に、select()またはepoll()を使用して、いずれかのソケットのパケットを同時に待機させることができます。

0

私はlibpcapライブラリを使うべきだと思います。 bpfパッカーフィルターにアクセスする必要があります。 これは簡単です。 または、iptablesルールとnetfilterライブラリを使用できます。特定のポートにすべてのパケットを転送するために、事前ルーティングiptablesルールを設定する必要があり、アプリケーションはこのポートをリスニングモードとしてバインドし、フルパケットを受信することができます。

関連する問題