2012-12-02 39 views
10

पर यूडीपी प्रसारण पैकेट प्राप्त करना हमारे पास मौजूदा सॉफ़्टवेयर है जो समय-समय पर स्थानीय सबनेट (x.x.x.255) पर एक विशिष्ट पोर्ट (7125) पर यूडीपी पैकेट को प्रसारित करता है। हमारे पास एचपी-यूएक्स (11.11) पर चल रहे सॉफ़्टवेयर की निगरानी है जो इन पैकेट को कोई समस्या नहीं प्राप्त करने में सक्षम है। हालांकि, निगरानी सॉफ्टवेयर को लिनक्स (आरएचईएल 6.1) में पोर्ट करने के बाद हमने पाया है कि इसे प्रसारण पैकेट नहीं मिलते हैं। tcpdump लिनक्स होस्ट पर आने वाले पैकेट दिखाता है, लेकिन कर्नेल उन्हें हमारे सॉफ़्टवेयर के माध्यम से नहीं भेजता है।लिनक्स

मैं कुछ पाइथन 2.x स्क्रिप्ट का उपयोग कर रहा हूं जो सॉकेट एपीआई की नकल करते हैं मॉनीटरिंग सॉफ़्टवेयर विभिन्न परिदृश्यों का परीक्षण करने के लिए उपयोग करता है। लिनक्स कर्नेल रिसीवर सॉफ़्टवेयर में पैकेट पास करता है यदि प्रेषक यूनिकास्ट (10.1.0.5) का उपयोग करता है, लेकिन प्रसारण नहीं करता (10.1.0.255)। मैं कई दिनों से वेब खोज रहा हूं और किसी को भी एक ही समस्या के साथ नहीं मिला है। कोई विचार?

receiver.py

from __future__ import print_function 
import socket 

localHost = '' 
localPort = 7125 
remoteHost = '10.1.0.5' 
remotePort = 19100 

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 
s.bind((localHost, localPort)) 
s.connect((remoteHost, remotePort)) 
print('Listening on {0}:{1} for traffic from {2}:{3}'.format(localHost, localPort, remoteHost, remotePort)) 
data = s.recv(1024) 
print('Received: {0}'.format(data)) 
s.close() 

sender.py

from __future__ import print_function 
import socket 
import time 

localHost = '' 
localPort = 19100 
remoteHost = '10.1.0.255' 
remotePort = 7125 

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 
s.bind((localHost, localPort)) 
s.connect((remoteHost, remotePort)) 
data = 'sending this from {0}:{1} to {2}:{3}'.format(localHost, localPort, remoteHost, remotePort) 
print(data) 
print('2') 
time.sleep(1) 
print('1') 
time.sleep(1) 
s.send(data) 
print('sent at {0}'.format(time.ctime())) 
s.close() 
+2

क्या आपके रिसीवर को प्रसारण पते या 'INADDR_BROADCAST' (255.255.255.255, प्रसारण के' INADDR_ANY') को 'बाध्य' करने की आवश्यकता नहीं है? यही है, 'SO_BROADCAST' विकल्प (दोनों तरफ) को सेट करने के अलावा, जैसा कि आप पहले से कर रहे हैं। क्या आप इन सभी सॉकेट सिस्टम कॉल के त्रुटि/वापसी कोड की जांच कर रहे हैं? –

+0

@ मैथ्यूहॉल आह, प्रसारण पते पर बाध्यकारी काम करता है! मुझे लगता है कि इसका मतलब है कि लिनक्स आपको यूनिकास्ट और प्रसारण के बीच चुनता है? हम 'INADDR_ANY' से जुड़ने और एचपी-यूएक्स पर यूनिकास्ट और प्रसारण पैकेट दोनों प्राप्त करने में सक्षम हैं। – goose

+0

हां, ऐसा लगता है कि आपको चुनना है। मैंने अब आपके प्रश्न का एक कैननिकल जवाब पोस्ट कर दिया है। हालांकि, मैं कुछ हद तक परेशान हूं कि एचपी-यूएक्स से लिनक्स पर व्यवहार अलग क्यों है (हालांकि इस बात के तर्क हैं कि क्यों प्रसारण और यूनिकास्ट को अलग करना बेहतर होगा)। मेरे लिए, यह बताता है कि हम सबकुछ नहीं जानते हैं, और अच्छी तरह से, यह सामान्य रूप से अस्वीकार्य है। मैं लिनक्स पर प्रसारण विकल्पों को पूरी तरह से निकालने के लिए सी में दो टेस्ट प्रोग्राम लिखने का लुत्फ उठा रहा हूं, हालांकि मेरे पास कोई एचपी-यूएक्स नहीं है ... तब तक, उम्मीद है कि मेरा जवाब इसे कवर करेगा। –

उत्तर

13

ठीक है, मैं एक टिप्पणी में इस उत्तर का सुझाव दिया है, और यह व्यवहार में सही साबित कर दिया। मैं अपने कोड के साथ आस-पास की बारीकियों की जांच करना चाहता हूं, लेकिन यह कैननिकल केस-करीब है।

दोनों पक्षों पर SO_BROADCAST सॉकेट विकल्प सेट (आप पहले से ही सही ढंग से कर रहे हैं), तो आप भी प्रसारण पता करने के लिए अपने रिसीवर आबद्ध करना होगा के अलावा (जैसे, INADDR_BROADCAST, जो 255.255.255.255 है और अनिवार्य रूप से एक ही भूमिका में कार्य करता है यूनिकास्ट के लिए INADDR_ANY के रूप में)।

जाहिर है, मूल रूप से पोस्ट, UDP सॉकेट (या INADDR_ANY विशेष रूप से) एक यूनिकास्ट पता करने के लिए बाध्य HP-UX विन्यास में लेकिन SO_BROADCAST सॉकेट विकल्प सेट के साथ अभी भी प्राप्त होगा सभी UDP डाटाग्राम स्थानीय प्रसारण पते को संबोधित मेजबान पर निर्देशित यूनिकास्ट यातायात के साथ-साथ।

लिनक्स के तहत, ऐसा नहीं है। एक यूडीपी सॉकेट बाध्यकारी, भले ही SO_BROADCAST -enabled, INADDR_ANY पर बाध्य बंदरगाह पर यूनिकास्ट और प्रसारण डेटाग्राम दोनों प्राप्त करने के लिए अपर्याप्त है। प्रसारण ट्रैफ़िक के लिए कोई अलग INADDR_BROADCAST -bound SO_BROADCAST सॉकेट का उपयोग कर सकता है।

+3

हमारे लिए समाधान वास्तव में सबनेट प्रसारण पते से जुड़ना था, न कि 'INADDR_BROADCAST'।साथ ही, हम एक अनुरूपित वातावरण चलाते हैं जहां हम प्रसारण के बजाए यूनिकास्ट प्राप्त करना चाहते हैं, इसलिए यह अंतिम समाधान नहीं था। हालांकि, अगर आप 'INADDR_BROADCAST' संपादित करते हैं तो मैं चेक मार्क पर क्लिक करूंगा। – goose

+0

जिज्ञासा से बाहर, क्या यह कहीं भी दस्तावेज किया गया था? – Clay

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^