2

私のアプリケーションは、複数の宛先ポートから UDP パケットを受信する必要があります (これは善意のアプリケーションであり、スニファではありません)。したがって、PF_PACKET ソケットを使用し、アプリケーション レベルでポート フィルタリングを行うことにしました。

ソケットを作成する方法は次のとおりです。

int g_rawSocket = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

UDP パケットを正しく受信しています。ただし、アプリケーションが実行されているカーネルは、タイプ「Destination unreachable」およびコード「Port unreachable」の ICMP パケットを、アプリにパケットを送信しているリモート デバイスに送信しています。これは、ポート番号をソケットにバインドしていないためだと思います。ただし、特に複数のポートをそれにバインドする必要があるため、PF_PACKET ソケットで bind を使用するのが適切かどうか疑問に思いますが、これは不可能だと思います。

コメントをお願いします。

4

2 に答える 2

0

いいえ、トランスポート(UDP / TCP)レイヤーよりも低いレベルで動作しているため、特定のポートにバインドすることはできません。ただし、通常のUDP(AF_INET / SOCK_DGRAM)ソケットを使用してすべてのソケットを開いてリッスンし、たとえば選択することができます。私が知る限り、バインドして、必要な数のソケットをリッスンできます。プロセスのオープンファイル記述子の制限を超えています。

于 2012-10-23T14:18:57.887 に答える
0

私は自分のアプリケーションでも同じことをしました。

私の場合、必要なだけソケットを作成し、それらを特定のポートにバインドしました。しかし、ソケットを聞いていません。だから私は1つの生のソケットを作成しました

int sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_UDP);

そして、ICMP なしですべてのトラフィックを受信しました。

だから、ICMPを避けるためにすべてのポートをバインドする必要があると思います

于 2012-11-06T07:22:58.020 に答える