मैं दो अनुप्रयोगों से एक बंदरगाह का उपयोग करने की कोशिश कर रहा हूं और उनमें से प्रत्येक को आईपी पते के एक अलग सेट से पैकेट प्राप्त होता है। इसे प्राप्त करने के लिए, मैं 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 ध्वज का उपयोग को सुनता है। आईपी 192.168.255.1
वाली मशीन से मैं चला रहा हूं। मेरे फ़िल्टर के आधार पर मैं दूसरी प्रक्रिया द्वारा उस आईपी पते से प्राप्त होने वाले सभी ट्रैफिक की अपेक्षा करता हूं। हालांकि, यह सब पहले प्राप्त किया गया है। जब मैं एक सरल करने के लिए फिल्टर बदलने के लिए:
struct sock_filter code[]={ { 0x6, 0, 0, 0x00000001 }, };
यह काम करता है की उम्मीद है और सभी पैकेट दूसरी प्रक्रिया के द्वारा प्राप्त कर रहे हैं। कोई विचार क्यों यह हो रहा है?
वापस जाने के लिए कैसे आप मूल फिल्टर के साथ आया है ? –