2017-05-30 91 views
-1

我有一个产品直接插入到我的计算机的以太网端口,发送多播数据包到224.224.10.10和UDP端口24588.我已经在下面的代码中设置了我的UDPclient,感觉我已经设置正确,但我仍然没有收到任何数据包。我总是发现一个例外,说我超时等待回应。任何想法或明显的错误?使用UDPClient获取多播消息

在发布此消息之前,我查看了很多问题,但无法获得解决方案,而且找不到与我拥有的设置类型相同的任何人。

public class ReceiverClass 
{ 
    private UdpClient m_UDPClient = null; 
    private Thread m_UDPReceiverThread = null; 
    private bool m_ContinueReceiving = false; 
    private readonly object m_sync = new object(); 
    private const int UDP_PORT = 24588; 

    public ReceiverClass() 
    { 
     m_ContinueReceiving = true; 
     m_UDPClient = new UdpClient(UDP_PORT); 
     m_UDPClient.Client.ReceiveTimeout = 20000; 

     m_UDPReceiverThread = new Thread(ReceiveData) { IsBackground = true }; 
     m_UDPReceiverThread.Start(); 
    } 

    private void ReceiveData() 
    { 
     bool Continue; 
     byte[] ReceiveBuffer; 
     IPEndPoint defaultIP = new IPEndPoint(IPAddress.Any, 0); 

     m_UDPClient.JoinMulticastGroup(IPAddress.Parse("224.224.10.10")); 
     m_UDPClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 

     lock (m_sync) 
     { 
      Continue = m_ContinueReceiving; 
     } 

     while (Continue) 
     { 
      try 
      { 
       ReceiveBuffer = m_UDPClient.Receive(ref defaultIP); 

       if (null != ReceiveBuffer) 
       { 
        // Do stuff with received... 
       } 
      } 
      catch (Exception e) 
      { 
       // ooo eee kill stream 
       Dispose(false); 
       return; 
      } 
      finally 
      { 
       lock (m_sync) 
       { 
        Continue = m_ContinueReceiving; 
       } 
      } 
     } 
    } 
} 

回答

0

我最终什么事做打算的套接字类和看原始数据包,并挑选出我所需要的。我将套接字绑定到我的lan接口,并嗅出一些东西。我必须以管理员身份运行它才能使其正常运行,但那很好。我走了这条路,因为我可以在wireshark中看到数据包,但他们没有进入我的udpclient。这最终成为获得我想要的最快方式。

 Socket ReceiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); 
     EndPoint DefaultIPEndpoint = new IPEndPoint(IPAddress.Parse("10.0.2.0"), 0); 

     ReceiveSocket.ReceiveTimeout = 5000; 
     ReceiveSocket.Bind(DefaultIPEndpoint); 
     ReceiveSocket.IOControl(IOControlCode.ReceiveAll, new byte[4] { 1, 0, 0, 0 }, null); 

     while (true) 
     { 
      byte[] ReceiveBuffer = new byte[512]; 
      int ByteCount = 0; 

      ByteCount = ReceiveSocket.ReceiveFrom(ReceiveBuffer, ref DefaultIPEndpoint); 
      // Handle packets ... 
     } 
0

我看不到任何马上出现错误的代码,所以我没有正确的答案给你。但是,这是我用来获取UDP广播消息的一段代码。希望这会为你工作,或给你一些新的想法:

class UdpHandler { 

    public UdpHandler(int portNo) { 
     Thread t = new Thread(ListenThread); 
     t.IsBackground = true; 
     t.Start(portNo); 
    } 

    public void ListenThread(object portNo) { 
     UdpClient client = new UdpClient { ExclusiveAddressUse = false }; 
     IPEndPoint localEp = new IPEndPoint(IPAddress.Any, (int)port); 
     client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     client.ExclusiveAddressUse = false; 
     client.Client.Bind(localEp); 

     while (true) { 
      byte[] data = client.Receive(ref localEp); 
      DataReceived(data); 
     } 
    } 

    private void DataReceived(byte[] rawData) { 
     // Handle the received data 
    } 
} 
+0

是的,它没有帮助我。我认为广播和多播消息之间的设置有所不同,但我不知道是什么。仍然卡住。感谢您的帮助,但我很感激。 – shoyo