2012-12-11 23 views
10

UDP kullanarak göndermek ve almak için gereken bir C# programı oluşturmak için mono kullanıyorum. Şu anda benim uygulama Windows üzerinde beklendiği gibi çalışır ama Ubuntu veya Fedora sistemleri ile çalışmak için iletişim sorunları var.C# içinde UDP C# Windows üzerinde çalışır ama Linux değil

Windows, kendi datagramlarını yayınlayabilir ve alabilir.
Ubuntu kendi datagramlarını yayınlayabilir ve alabilir. Bu yayınlar Windows tarafından alınır, ancak , Windows tarafından yayınlanan datagramları görmez.
Fedora yayın yapabilir, ancak herhangi bir yerden (kendi başına değil) datagram almaz. Bu yayınlar Windows tarafından alınır.

Datagramlar linux makinelerinden birine erişemediğinde, 'alma' işlevi hiçbir zaman tetiklenmez.

Bu

Bugüne kadar ne var:

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

yöntem UDPClient asenkron aramaları kullanır almak;

Ve gönderme yöntemi;

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); 
} 

Fedora ile bazı testlerin ardından, yayın için 255.255.255.255 kullanımı ile ilgili bir sorun gibi görünüyor. Bunu yapmanın başka yolu var mı?

+4

Herhangi bir hata alır mıyım:

Burada adaptör başına yönettiği IPV4 yayın adresi hesaplanırken bir örnek? Herhangi bir çalışma zamanı hatası olup olmadığını görmek için 'try-catch' 'ı kaldırmayı denediniz mi? Hiç çağırıldığını görmek için "al" seçeneğinde bir kesme noktası mı kurdunuz? –

+0

'Try-catch' sadece birden fazla kullanıcıdan almak içindir - hata ayıklama kodumda istisna konsola yazdırılır. Diğer sistemlerde alma yöntemini hata ayıklamayı deneyeceğim (denemek istediğim bir şey değildi). –

+0

Alıcı kodu Fedora'ya asla kovulmaz. Bu, datagramın nereden kaynaklandığından bağımsız olarak görünüyor (yerel makineden ve bir pencere kutusundan göndermeyi denedim). –

cevap

2

Bunu bir yorumda belirtmiştim ancak bunu bir yanıt olarak ekledim çünkü gözden kaçırmış olabilirsiniz ve hiçbir yanıt gelmiyor gibi görünüyor.

Yayın için 255.255.255.255 kullanmak yerine yerel IP alt ağınızın yayın adresini kullanın (örneğin 192.168.0.1/24 alt ağında 192.168.0.255). 255.255.255.255 adresi bir yönlendirici tarafından iletilmez (istemcilerinizin sitelerinde birden fazla alt ağ varsa bu durum geçerlidir), yönlendirilmiş bir yayın iletilebilir (yapılandırılmışsa). Yönlendiricilerin varsayılan olarak yönlendirilmiş yayınları yönlendirmesi olacağı, ancak bu durumun RFC2644'da değiştiği, dolayısıyla çiftlikte bahse girmeyeceği;

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()); 
     } 
    } 

}