2009-04-20 15 views
9

मैं अपने स्थानीय नेटवर्क पर कुछ सरल यूडीपी संचार काम करने की कोशिश कर रहा हूं।सी # में स्थानीय नेटवर्क में यूडीपी मल्टीकास्ट कैसे करें?

सभी मैं करना चाहता हूँ मेरी प्राप्त कोड है नेटवर्क

यहाँ मेरी भेज रहा है कोड

public void SendMessage(string message) 
    { 
     var data = Encoding.Default.GetBytes(message); 
     using (var udpClient = new UdpClient(AddressFamily.InterNetwork)) 
     { 
      var address = IPAddress.Parse("224.100.0.1"); 
      var ipEndPoint = new IPEndPoint(address, 8088); 
      udpClient.JoinMulticastGroup(address); 
      udpClient.Send(data, data.Length, ipEndPoint); 
      udpClient.Close(); 
     } 
    } 

और यहाँ पर सभी मशीनों के लिए एक बहुस्त्र्पीय करना है

public void Start() 
    { 
     udpClient = new UdpClient(8088); 
     udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50); 

     receiveThread = new Thread(Receive); 
     receiveThread.Start(); 
    } 

    public void Receive() 
    { 
     while (true) 
     { 
      var ipEndPoint = new IPEndPoint(IPAddress.Any, 0); 
      var data = udpClient.Receive(ref ipEndPoint); 

      Message = Encoding.Default.GetString(data); 

      // Raise the AfterReceive event 
      if (AfterReceive != null) 
      { 
       AfterReceive(this, new EventArgs()); 
      } 
     } 
    } 

यह काम करता है पूरी तरह से मेरी स्थानीय मशीन पर लेकिन नेटवर्क भर में नहीं।

-फ़ायरवॉल प्रतीत नहीं होता है। मैंने इसे दोनों मशीनों पर अक्षम कर दिया और यह अभी भी काम नहीं कर सका।

- यह काम करता है अगर मैं क्लाइंट मशीन (यानी मल्टीकास्ट नहीं) के हार्ड कोडित आईपी पते पर सीधे भेजता हूं।

किसी भी मदद की सराहना की जाएगी।

उत्तर

7

क्या आपका स्थानीय नेटवर्क हार्डवेयर IGMP का समर्थन करता है?

यह संभव है कि आपका स्विच मल्टीकास्ट जागरूक है, लेकिन यदि आईजीएमपी अक्षम है तो यह ध्यान नहीं देगा कि कोई संलग्न हार्डवेयर किसी विशेष मल्टीकास्ट समूह की सदस्यता लेता है, तो यह उन पैकेट को अग्रेषित नहीं करेगा।

इसका परीक्षण करने के लिए, अस्थायी रूप से दो मशीनों को एक क्रॉस-ओवर केबल के साथ सीधे कनेक्ट करें। वह (AFAICR) हमेशा काम करना चाहिए।

इसके अलावा, यह सर्वर कोड का आधा होना चाहिए जिसमें टीटीएल तर्क JoinMulticastGroup() पर दिया गया है, क्लाइंट आधा नहीं।

0

मुझे कोड में कहीं भी TTL निर्दिष्ट नहीं किया जा सकता है। याद रखें कि टीटीएल मूल रूप से यूनिट सेकेंड में होना था, लेकिन यूनिट होप्स बन गया है। इसका मतलब है कि एक चालाक टीटीएल का उपयोग करके आप राउटर से गुजरने को खत्म कर सकते हैं। मेरी मशीन पर डिफ़ॉल्ट टीटीएल 32 है - मुझे लगता है कि पर्याप्त से अधिक होना चाहिए; लेकिन आपका सिस्टम वास्तव में अलग हो सकता है (UdpClient.Ttl) यदि आपका सिस्टम सुरक्षा लॉकडाउन के किसी भी रूप में है।

मैं आपको आवश्यक टीटीएल की सिफारिश नहीं कर सकता - क्योंकि मुझे व्यक्तिगत रूप से बहुत सारे प्रयोग करने की आवश्यकता है।

यदि वह काम नहीं करता, तो आप इन लेखों पर एक नज़र हो सकता है:

ऑल-इन-सब ऐसा लगता है कि वहाँ के साथ सफलता प्राप्त हुई है सॉकेट का उपयोग करना और UdpClients नहीं।

आपका चुना गया मल्टीकास्ट समूह भी स्थानीय-केवल हो सकता है। Try another one.

आपकी भौतिक नेटवर्क परत भी समस्याएं पैदा कर सकती है। मैं स्विच स्विच और प्रत्यक्ष (एक्स-ओवर) कनेक्शन पूछता हूं। हब्स और सभी बुद्धिमान उन्हें ठीक से संभालना चाहिए। हालांकि, मेरे पास वापस करने के लिए कोई साहित्य नहीं है।

1

मैं बस कुछ इसी तरह (मुझे लगता है कि) पर 4 घंटे खर्च किया है, मेरे लिए समाधान था:

client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT)); 
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First()); 
client.MulticastLoopback = true; 

एक विशिष्ट बहुस्त्र्पीय समूह पर (पहले बाह्य) आईपी पते का उपयोग करना।

+0

मुझे इसे लैन पर भी काम करने में परेशानी हो रही थी। JoinMulticastGroup() को कॉल करते समय सुनने के लिए एक स्पष्ट आईपी पते के दूसरे तर्क के बिना, यह मनमाने ढंग से कुछ वर्चुअल ईथरनेट ड्राइवर चुन रहा था जिसे मैंने डॉकर/हाइपर-वी के हिस्से के रूप में स्थापित किया था और इसे मेरे असली ईथरनेट के बजाय मल्टीकास्ट समूह में शामिल किया था अनुकूलक। यदि आपके पास एक से अधिक नेटवर्क एडेप्टर हैं, तो आप मल्टीकास्ट समूह में शामिल होने के लिए आईपी एड्रेस निर्दिष्ट करना चाहते हैं, स्पष्ट रूप से विधि अधिभार के साथ जो दूसरे तर्क के रूप में आईपी पता लेता है। – MEverett

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