2016-03-04 38 views
0

试图从本地网络中的设备接收UPnP广播。我确实发现了很多类似的问题,并尝试了一些建议,但都没有成功的主题。我确实看到了Wireshark的UDP数据包,所以它们实际上是在我的电脑上收到的。有什么建议么?使用UdpClient收听UPnP广播

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

public class UDPListener 
{ 
    private const int listenPort = 1900; 

    private static void StartListener() 
    { 
     bool done = false; 

     IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, listenPort); 

     UdpClient listener = new UdpClient(); 
     listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);   
     listener.Client.Bind(localEndPoint); 
     listener.JoinMulticastGroup(IPAddress.Parse("239.255.255.250")); 
     listener.MulticastLoopback = true; 

     IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 0); 

     try 
     { 
      while (!done) 
      { 
       Console.WriteLine("Waiting for broadcast"); 
       var bytes = listener.Receive(ref groupEP); 

       Console.WriteLine("Received broadcast from {0} :\n {1}\n", 
        groupEP.ToString(), 
        Encoding.ASCII.GetString(bytes, 0, bytes.Length)); 

      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
     finally 
     { 
      listener.Close(); 
     } 
    } 

    public static int Main() 
    { 
     StartListener(); 

     return 0; 
    } 
} 
+0

看看这个,也许它会帮助你:http://stackoverflow.com/questions/12794761/upnp-multicast-missing-答案 - 从-M-搜索发现 – Gusman

回答

1

感谢尝试和错误我确实通过在绑定到多播组时指定我的本地地址来工作。我在示例中对地址进行了硬编码,因为它只是一个沙盒应用程序。使用IPAddress.Any不起作用。我不知道为什么。对于未来的参考和其他可怜的灵魂谁可能会寻找类似的东西:

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

public class UDPListener 
{ 
    private static void StartListener() 
    { 
     bool done = false; 

     IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 1900); 

     UdpClient listener = new UdpClient(); 
     listener.Client.Bind(localEndPoint); 
     listener.JoinMulticastGroup(IPAddress.Parse("239.255.255.250"), IPAddress.Parse("10.32.4.129")); 

     IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 0); 

     try 
     { 
      while (!done) 
      { 
       Console.WriteLine("Waiting for broadcast"); 
       var bytes = listener.Receive(ref groupEP); 

       Console.WriteLine("Received broadcast from {0} :\n {1}\n", 
        groupEP.ToString(), 
        Encoding.ASCII.GetString(bytes, 0, bytes.Length)); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
     finally 
     { 
      listener.Close(); 
     } 
    } 

    public static int Main() 
    { 
     StartListener(); 

     return 0; 
    } 
}