C# 使用UDPClient获取多播消息

C# 使用UDPClient获取多播消息,c#,C#,我有一个产品直接插入我的计算机的以太网端口,向224.224.10.10和UDP端口24588发送多播数据包。我已经在下面的代码中设置了我的UDPclient,我觉得我已经正确设置了它,但是我仍然没有收到任何数据包。我总是捕捉到一个异常,说我等待响应超时。有什么想法或明显的错误吗 在发布这篇文章之前,我看了很多问题,但我没有找到解决方案,也找不到任何人拥有与我相同类型的设置 public class ReceiverClass { private UdpClient m_UDPClien

我有一个产品直接插入我的计算机的以太网端口,向224.224.10.10和UDP端口24588发送多播数据包。我已经在下面的代码中设置了我的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;
                }
            }
        }
    }
}

我看不出你的代码有什么问题,所以我没有合适的答案。然而,这里有一段代码我用来获取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
    }
}

我最后做的是去上Sockets课程,查看原始数据包,挑选出我需要的东西。我将套接字绑定到我的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 ...
        }

是的,这对我没有帮助。我认为广播消息和多播消息之间的设置有所不同,但我不知道是什么。还是卡住了。谢谢你的帮助,我很感激。