2012-09-25 26 views
6

में यूडीपी प्रसारण संदेश प्राप्त करना मुझे पता है कि इस सवाल से कई बार पूछा गया है। मैंने सभी उत्तरों को पढ़ लिया है और कोड के EVRY टुकड़े को मैं कोशिश कर सकता था। कुछ दिनों के बाद मैं बहुत हताश हूं कि मुझे आपको मदद के लिए पूछना है।सी #

मेरे पास मेरे घर नेटवर्क में एक डिवाइस और एक पीसी है। डिवाइस यूडीपी प्रसारण संदेश भेजता है। मेरे पीसी पर मैं wireshark में उन संदेशों को देख सकते हैं:

स्रोत गंतव्य लंबाई

192.168.1.102 0.0.0.0 यूडीपी 60 स्रोत पोर्ट: 9050 गंतव्य बंदरगाह: 0

इसका मतलब है कि पैकेट पर आ रहे हैं मेरे पीसी। मेरा अगला कदम एक सी # एप्लिकेशन बनाना था जो उन पैकेट प्राप्त करता है। जैसा ऊपर बताया गया है मैंने हर संभव समाधान की कोशिश की, लेकिन यह कुछ भी प्राप्त नहीं होगा।

तो मुझे लगता है कि कुछ गलत होना चाहिए जो मैं गलत कर रहा हूं। क्या कोई मेरी मदद कर सकता है? धन्यवाद!

+1

क्या आप पैकेट को सुनने के लिए उपयोग कर रहे कोड को पोस्ट कर सकते हैं? – tomasmcguinness

+0

मैंने कोड से कोशिश की: http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/ और http://www.java2s.com/Code/CSharp/Network/ReceiveBroadcast। एचटीएम और http://stackoverflow.com/questions/746519/udpclient-receive-on-broadcast-address – Boris

+0

कोई सक्रिय फ़ायरवॉल? मुझे यकीन नहीं है कि Wireshark संकुल को कैसे रोकता है लेकिन यह हो सकता है कि फ़ायरवॉल उन्हें बाद में – Default

उत्तर

0

आप ठीक हैं, उनके पास कोड में कुछ तार है जो समस्या का कारण बनता है। (मैंने लेख नहीं पढ़ा है, बस पेस्ट की प्रतिलिपि बनाएँ)

यह हमेशा स्थानीय मशीन से काम करता है, लेकिन रिमोट मशीन से यह किसी कारण से विफल हो जाएगा।

इसे ठीक करने के लिए: ब्रॉडकास्ट में वे दो बार प्रसारित करते हैं। एक बार स्थानीयहोस्ट के लिए और फिर लक्षित आईपी एड्रेस (आईपीपी 2) के लिए। बस

sock.SendTo(data, iep1); 

और इसे कार्य करना चाहिए।

कोई विचार क्यों नहीं।

1

बस एक ही समस्या का अनुभव किया, और यह साझा करना चाहता था कि यह मेरे लिए क्या तय करे।

संक्षेप में: ऐसा लगता है कि विंडोज फ़ायरवॉल किसी भी तरह से इस अजीब व्यवहार का कारण था, और केवल सेवा को अक्षम करने में मदद नहीं करता है। आपको विंडोज फ़ायरवॉल इनबाउंड नियम सूची में विशिष्ट प्रोग्राम (निष्पादन योग्य) के लिए आने वाले यूडीपी पैकेट को स्पष्ट रूप से अनुमति देना होगा।

पूर्ण केस विवरण के लिए, पढ़ें।

मेरा नेटवर्क सेटअप है: मेरी (प्राप्त करने वाली) मशीन का आईपी 1 9 2.168.1.2 था, मशीन भेजने का आईपी 1 9 2.168.1.50 था, और दोनों मशीनों पर सबनेट मास्क 255.255.255.0 था। मेरी मशीन विंडोज 7 x64 चल रही है।

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); 
sock.Bind(iep); 
sock.EnableBroadcast = true; 
EndPoint ep = (EndPoint)iep; 
byte[] buffer = new byte[1000]; 
sock.ReceiveFrom(buffer, ref ep); 

प्रारंभ में यह काम नहीं किया, जब तक कि मुझे लगता है कि सॉकेट से एक प्रसारण पैकेट भेजा से पहले मैं इस पर ReceiveFrom फोन:

इस कोड (मोटे तौर पर) है कि मैं प्रयोग किया जाता है। अर्थात। ReceiveFrom कॉल करने से पहले इस लाइन को जोड़ने:

sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort)) 

जब मैं नहीं सॉकेट प्राप्त करने से पहले प्रसारण पैकेट भेजा था, भेजे प्रसारण पैकेट यह द्वारा प्राप्त नहीं किया गया है, भले ही वे Wireshark में छपी (पैकेट के गंतव्य 255.255 था। 255.255)।

मैंने सोचा कि ऐसा लगता है कि फ़ायरवॉल आने वाले पैकेट के साथ गड़बड़ कर रहा है (जब तक कि किसी प्रकार का यूडीपी छेद आउटगोइंग पैकेट द्वारा पहले खोला नहीं जाता है - भले ही मैंने सुना है कि यूडीपी छेद पंचिंग किसी भी तरह से प्रसारण पैकेट पर लागू नहीं होता है), तो मैं सेवाओं और अक्षम विंडोज फ़ायरवॉल सेवा पूरी तरह से चला गया। यह कुछ भी नहीं बदला।

हालांकि, बाकी सब कुछ करने के बाद, मैंने फ़ायरवॉल सेवा को फिर से सक्षम किया, और प्रोग्राम को फिर से चलाने की कोशिश की। इस बार, फ़ायरवॉल प्रॉम्प्ट ने मुझसे पूछा कि क्या मैं फ़ायरवॉल के माध्यम से MyProgram.vshost.exe प्रक्रिया (मैं विजुअल स्टूडियो में डिबगिंग कर रहा था) को अनुमति देना चाहता हूं, मैंने इसे स्वीकार किया, और वॉयला - सब कुछ काम किया! आने वाले पैकेट अब प्राप्त किए जा रहे थे!