2012-10-09 21 views
11

से लापता उत्तरों मैंने यूपीएनपी मल्टीकास्ट (विजुअल सी # 2010 एक्सप्रेस, विंडोज 7 प्रोफेशनल 64 बिट पर चलने) का परीक्षण करने के लिए एक छोटा सा कार्यक्रम बनाया। मैं अपने नेटवर्क में यूपीएनपी उपकरणों से यूपीएनपी नोटिफ़ाई संदेश प्राप्त कर सकता हूं। लेकिन जब मैं एम-सर्च संदेश भेजता हूं, तो मुझे कोई जवाब नहीं मिलता है।यूपीएनपी मल्टीकास्ट: एम-सर्च (डिस्कवरी)

मैंने आईओएस पर्यावरण पर एक ही कोड का परीक्षण किया है (आईओएस के लिए मोनोटच, मैक पर एक आईफोन सिम्युलेटर पर चल रहा है)। वहां यह ठीक चलता है और मुझे अपने यूपीएनपी उपकरणों से सभी खोज प्रतिक्रियाएं मिलती हैं। मैं अपने विंडोज प्रोग्राम से एम-सर्च संदेश भी देख सकता हूं।

ऐसा लगता है कि विंडोज (या फ़ायरवॉल?) खोज प्रतिक्रियाओं को छुपा रहा है। कोई उपाय?

IPEndPoint LocalEndPoint = new IPEndPoint(IPAddress.Any, 1900); 
IPEndPoint MulticastEndPoint = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900); 

Socket UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

UdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
UdpSocket.Bind(LocalEndPoint); 
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(MulticastEndPoint.Address, IPAddress.Any)); 
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2); 
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true); 

Console.WriteLine("UDP-Socket setup done...\r\n"); 

string SearchString = "M-SEARCH * HTTP/1.1\r\nHOST:239.255.255.250:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\nMX:3\r\n\r\n"; 

UdpSocket.SendTo(Encoding.UTF8.GetBytes(SearchString), SocketFlags.None, MulticastEndPoint); 

Console.WriteLine("M-Search sent...\r\n"); 

byte[] ReceiveBuffer = new byte[64000]; 

int ReceivedBytes = 0; 

while (true) 
{ 
    if (UdpSocket.Available > 0) 
    { 
     ReceivedBytes = UdpSocket.Receive(ReceiveBuffer, SocketFlags.None); 

     if (ReceivedBytes > 0) 
     { 
      Console.WriteLine(Encoding.UTF8.GetString(ReceiveBuffer, 0, ReceivedBytes)); 
     } 
    } 
} 
+0

MulticastEndPoint क्या सेट है? – simonc

+0

क्या आप वाकई आईओएस पर देखे गए एम-सर्च को अपने विंडोज प्रोग्राम में से एक है? क्या आपने अपने विंडोज बॉक्स पर एक और यूपीएनपी खोज उपकरण की कोशिश की है? –

+0

@PavelZdenek: हाँ मुझे यकीन है। मैंने एम-सर्च संदेश पर कुछ अतिरिक्त पात्र संलग्न किए हैं, इसलिए मैं आईओएस पर संदेश को पहचान सकता हूं। –

उत्तर

15

हाँ, मैं समस्या का समाधान:

यहाँ कोड है! छोटी गलती, बड़ा प्रभाव:

मेरा प्रोग्राम बंदरगाह 1 9 00 पर एम-सर्च भेज रहा है जो यूपीएनपी मल्टीकास्ट समूह से जुड़ा हुआ है। चूंकि मैंने उसी पोर्ट पर LocalEndPoint को बाध्य किया है, यूपीएनपी डिवाइस यूनिकास्ट के साथ बंदरगाह 1 9 00 के उत्तर देते हैं। आईओएस पर यह काम करता था, क्योंकि मेरा प्रोग्राम इस बंदरगाह से जुड़ी एकमात्र सेवा थी। लेकिन पीसी पर, मुझे पोर्ट 1 9 00 से जुड़ी कई सेवाएं मिलीं ("नेटस्टैट -पी यूडीपी-ए" के साथ मिली)। तो यूपीएनपी उपकरणों के यूनिकास्ट संदेशों को अन्य सेवाओं में से एक द्वारा अवशोषित किया गया था।

समाधान: मैंने लोकल एंडपॉइंट को एक मुफ्त बंदरगाह (उदाहरण के लिए 60000) पर बाध्य किया, और अब यह ठीक काम करता है!

IPEndPoint LocalEndPoint = new IPEndPoint(IPAddress.Any, 60000); 
+1

आप मुझसे अधिक तेज़ थे :-) हाँ, विंडोज डिफ़ॉल्ट रूप से एसएसडीपी सेवा चलाता है। Netstat विकल्प -b –

+0

के साथ एक नज़र डालें मेरे पास एक ही समस्या है लेकिन मैं अपना पोर्ट नहीं बदल सकता। क्या इस समस्या को ठीक करने का कोई और तरीका है? – Kingpin

+3

किसी विशिष्ट पोर्ट (60000) से बंधे न हों, बस एक क्षणिक (0) के लिए पूछें! या एक दिन यह असफल हो सकता है क्योंकि कोई और 60000 –

4

स्थानीय endpoint उपयोग बंदरगाह 0 (शून्य) के बनाने पर एक मुक्त बंदरगाह बाध्य करने के लिए एक निश्चित पोर्ट का उपयोग नहीं। एक और बिंदु की खोज की। बाध्यकारी IPAddress.Any या IPAddress.Loopback माइक्रोसॉफ्ट (स्थानीय?) सिस्टम से प्रतिक्रिया प्राप्त करता है जहां एक लैन एड्रेस (एसएस) में बाध्यकारी के रूप में स्थानीय नेट से प्रतिक्रिया प्राप्त होती है। पहले IPv4 पता हो रही इस तरह किया जा सकता है:

IPAddress localNetwork = Dns.GetHostAddresses(Environment.GetEnvironmentVariable("COMPUTERNAME")).Where(ia => (ia.AddressFamily == AddressFamily.InterNetwork)).First(); 
+0

का उपयोग कर रहा है आईपीवी 4 के लिए वास्तव में कोई सीमा नहीं है, मुझे आईपी वी 6 मल्टीकास्ट पते एफएफ 022 :: सी (लिंक-लोकल), एफएफ05 :: सी (साइट-लोकल) मिला है, एफएफ 08 :: सी (संगठन-स्थानीय) और एफएफ 0 ई :: सी (वैश्विक)। ध्यान दें कि आईपी वी 4 का दायरा साइट-स्थानीय है। [विकिपीडिया - एसएसडीपी] पर मिला (https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol) – VBWebProfi

+0

'' पर्यावरण। गेट पर्यावरण पर्यावरण ("COMPUTERNAME") '' 'पर्यावरण। माचिननाम 'द्वारा प्रतिस्थापित किया जा सकता है। – VBWebProfi

1

भावी पीढ़ी के लिए: ऊपर इन सभी विकल्पों की स्थापना एम खोज के लिए अनावश्यक है और यहां तक ​​कि प्रतिकूल हो सकता है:

UdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(MulticastEndPoint.Address, IPAddress.Any)); 
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2); 
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true); 

तो नहीं है कर दो।