私は2つのアプリケーションからポートを使用しようとしており、それぞれが異なるIPアドレスのセットからパケットを受信するようにしています。これを達成するために、私はSO_REUSEPORTとSO_ATTACH_REUSEPORT_CBPFソケットオプションを使用します。次のように私のコードは次のとおりです。SO_ATTACH_REUSEPORT_CBPFソケットオプションの予期しない動作
parentfd = socket(AF_INET, SOCK_STREAM, 0);
if (parentfd < 0)
error("ERROR opening socket");
struct sock_filter code[]={
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 3, 0x00000800 },
{ 0x20, 0, 0, 0x0000001a },
{ 0x15, 2, 0, 0xc0a8ff01 },
{ 0x6, 0, 0, 0x00000000 },
{ 0x6, 0, 0, 0x00040000 },
{ 0x6, 0, 0, 0x00000001 },
};
struct sock_fprog bpf = {
.len = ARRAY_SIZE(code),
.filter = code,
};
if (setsockopt(parentfd, SOL_SOCKET, SO_REUSEPORT, (const void *)&optval,sizeof(optval)))
error("ERROR setting SO_REUSEPORT");
if (setsockopt(parentfd, SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF, (const void *)&bpf, sizeof(bpf)))
error("ERROR setting SO_ATTACH_REUSEPORT_CBPF);
私ものみ SO_REUSEPORTフラグを使用して、同じポートをリスニング異なるプロセスを持っています。 IP 192.168.255.1
のマシンからecho 1234 | ncat 192.168.255.150 1234
を実行しています。私のフィルタに基づいて、私はそのIPアドレスからのすべてのトラフィックが第2のプロセスによって受信されると期待します。しかし、それは最初にすべて受信されます。私はシンプルにフィルタを変更した場合:
struct sock_filter code[]={ { 0x6, 0, 0, 0x00000001 }, };
を期待し、すべてのパケットが第二のプロセスによって受信されるように、それは動作します。なぜこれが起こっているかもしれないのか?
を返すことです? –