2012-12-11 17 views
10

मैं एक सी # प्रोग्राम बनाने के लिए मोनो का उपयोग कर रहा हूं जिसे यूडीपी का उपयोग करके भेजने और प्राप्त करने की आवश्यकता है। वर्तमान में मेरा कार्यान्वयन विंडोज़ पर अपेक्षित काम करता है लेकिन मुझे अपने उबंटू या फेडोरा सिस्टम के साथ काम करने के लिए संचार प्राप्त करने में समस्याएं हैं।सी # में यूडीपी विंडोज पर काम करता है लेकिन लिनक्स

विंडोज़ अपने स्वयं के डेटाग्राम प्रसारित और प्राप्त कर सकते हैं।
उबंटू अपने स्वयं के डेटाग्राम प्रसारित और प्राप्त कर सकता है। इसका प्रसारण विंडोज द्वारा प्राप्त किया जाता है लेकिन यह विंडोज द्वारा प्रसारित डेटाग्राम नहीं देखता है।
फेडोरा प्रसारण कर सकता है लेकिन कहीं से भी डेटाग्राम प्राप्त नहीं करता है (यहां तक ​​कि खुद भी नहीं)। इसका प्रसारण विंडोज द्वारा प्राप्त किया जाता है।

जब डेटाग्राम लिनक्स मशीनों में से किसी तक पहुंचने में विफल रहता है, तो 'प्राप्त' फ़ंक्शन कभी नहीं निकाल दिया जाता है।

यह वही है मैं अब तक है:

int _port = 4568; 
var server = new UdpClient(_port); 
var send_UDP = new UdpClient(); 

प्राप्त विधि UDPClient की अतुल्यकालिक कॉल उपयोग करता है;

और प्रेषण विधि;

public static void send(string message) 
{ 
    var target = new IPEndPoint(IPAddress.Parse("255.255.255.255"), _port); 
    byte[] data = Encoding.ASCII.GetBytes(message); 
    send_UDP.Send(data, data.Length, target); 
} 

फेडोरा के साथ कुछ परीक्षण के बाद, यह प्रसारण के लिए 255.255.255.255 के उपयोग के साथ एक मुद्दा प्रतीत होता है। क्या ऐसा करने का कोई और तरीका है?

+4

आप किसी भी त्रुटि मिल सकता है:

यहाँ अनुकूलक प्रति निर्देशित IPV4 प्रसारण पते की गणना का एक उदाहरण है? क्या आपने कोई रनटाइम त्रुटियों को देखने के लिए 'try-catch' को हटाने का प्रयास किया है? क्या आपने यह देखने के लिए 'प्राप्त' में ब्रेकपॉइंट सेट किया है कि यह बिल्कुल कहलाता है या नहीं? –

+0

'try-catch' केवल एकाधिक उपयोगकर्ताओं से प्राप्त करने के लिए है - मेरे डीबग कोड में अपवाद को कंसोल पर मुद्रित किया जाता है। मैं अन्य सिस्टम पर प्राप्त विधि को डीबग करने का प्रयास करूंगा (यह ऐसा कुछ नहीं था जिसे मैंने कोशिश करने के लिए सोचा था)। –

+0

प्राप्त कोड को फेडोरा पर कभी नहीं निकाल दिया जाता है। ऐसा लगता है कि डेटाग्राम कहां से उत्पन्न हुआ था (मैंने स्थानीय मशीन से और विंडोज़ बॉक्स से भेजने की कोशिश की)। –

उत्तर

2

मैंने इसे पहले से ही एक टिप्पणी में निर्दिष्ट किया है लेकिन इसे एक उत्तर के रूप में रखा है क्योंकि आपने इसे अनदेखा कर दिया है और कोई जवाब आने वाला प्रतीत नहीं होता है।

प्रसारण के लिए 255.255.255.255 का उपयोग करने के बजाय अपने स्थानीय आईपी सबनेट के प्रसारण पते का उपयोग करें (उदाहरण के लिए 1 9 2.168.0.124 सबनेट पर 1 9 2.168.0.255)। 255.255.255.255 पता राउटर द्वारा अग्रेषित नहीं किया जाएगा (यह प्रासंगिक है यदि आपके क्लाइंट की साइटों पर एकाधिक सबनेट हैं) जबकि एक निर्देशित प्रसारण को अग्रेषित किया जा सकता है (यदि ऐसा कॉन्फ़िगर किया गया हो)। यह ऐसा मामला होता था जो राउटर प्रति डिफ़ॉल्ट निर्देशित प्रसारण अग्रेषित करेंगे लेकिन यह RFC2644 में बदल दिया गया था, इसलिए खेत पर शर्त न लगाएं;)।

public static void DisplayDirectedBroadcastAddresses() 
{ 

    foreach (var iface in NetworkInterface.GetAllNetworkInterfaces() 
      .Where(c => c.NetworkInterfaceType != NetworkInterfaceType.Loopback)) 
    { 
     Console.WriteLine(iface.Description); 
     foreach (var ucastInfo in iface.GetIPProperties().UnicastAddresses 
       .Where(c => !c.Address.IsIPv6LinkLocal)) 
     { 
      Console.WriteLine("\tIP  : {0}", ucastInfo.Address); 
      Console.WriteLine("\tSubnet : {0}", ucastInfo.IPv4Mask); 
      byte[] ipAdressBytes = ucastInfo.Address.GetAddressBytes(); 
      byte[] subnetMaskBytes = ucastInfo.IPv4Mask.GetAddressBytes(); 

      if (ipAdressBytes.Length != subnetMaskBytes.Length) continue; 

      var broadcast = new byte[ipAdressBytes.Length]; 
      for (int i = 0; i < broadcast.Length; i++) 
      { 
       broadcast[i] = (byte)(ipAdressBytes[i] | ~(subnetMaskBytes[i])); 
      } 
      Console.WriteLine("\tBroadcast: {0}", new IPAddress(broadcast).ToString()); 
     } 
    } 

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