Tôi đang cố gắng sử dụng cổng từ hai ứng dụng và yêu cầu mỗi gói nhận gói từ một nhóm địa chỉ IP khác. Để đạt được điều này, tôi sử dụng các tùy chọn SO_REUSEPORT và SO_ATTACH_REUSEPORT_CBPF socket. Mã của tôi là như sau:Hành vi không mong muốn SO_ATTACH_REUSEPORT_CBPF tùy chọn ổ cắm
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);
Tôi cũng có một quá trình khác nhau mà nghe vào cổng tương tự sử dụng chỉ cờ SO_REUSEPORT. Từ máy có IP 192.168.255.1
Tôi đang chạy echo 1234 | ncat 192.168.255.150 1234
. Dựa trên bộ lọc của tôi, tôi dự kiến tất cả lưu lượng truy cập từ địa chỉ IP đó sẽ được nhận bởi quy trình thứ hai. Tuy nhiên, nó là tất cả nhận được bởi người đầu tiên. Khi tôi thay đổi bộ lọc để một đơn giản:
struct sock_filter code[]={ { 0x6, 0, 0, 0x00000001 }, };
Nó hoạt động như mong đợi và tất cả các gói nhận được bởi quá trình thứ hai. Bất kỳ ý tưởng tại sao điều này có thể xảy ra?
Làm thế nào bạn đã đưa ra các bộ lọc gốc ? –