如何从UDPClient响应UDP多播

本文关键字:UDP 多播 响应 UDPClient | 更新日期: 2023-09-27 18:27:27

在此之前,我想说我对UDP广播和多播的理解非常有限。这是我的第一个项目。

我有一个在机器上运行的C#桌面客户端和一个Windows phone 7应用程序。WP7应用程序应该通过网络发送UDP广播,桌面客户端应该侦听UDP多播并做出相应响应。这只是为了通过网络进行简单的机器发现,以找到运行桌面客户端的机器。

C#桌面客户端代码

    public class ConnectionListener
{
    private const int UDP_PORT = 54322;
    private static readonly IPAddress MULTICAST_GROUP_ADDRESS = IPAddress.Parse("224.0.0.1");
    private UdpClient _listener;
    public ConnectionListener()
    {
        _listener = new UdpClient(UDP_PORT, AddressFamily.InterNetwork);
        _listener.EnableBroadcast = true;
        _listener.JoinMulticastGroup(MULTICAST_GROUP_ADDRESS);
        _listener.BeginReceive(ReceiveCallback, null);
    }
    private void ReceiveCallback(IAsyncResult result)
    {
        IPEndPoint receiveEndpoint = new IPEndPoint(IPAddress.Any, UDP_PORT);
        byte[] receivedBytes = _listener.EndReceive(result, ref receiveEndpoint);
        byte[] response = Encoding.UTF8.GetBytes("WPF Response");
        _listener.BeginSend(response, response.Length, receiveEndpoint, SendCallback, null);
    }
    private void SendCallback(IAsyncResult result)
    {
        int sendCount = _listener.EndSend(result);
        Console.WriteLine("Sent Count is: " + sendCount);
    }
}

WP7服务器代码:

    public class MachineDetector
{
    public const int UDP_PORT = 54322;
    private const string MULTICAST_GROUP_ADDRESS = "224.0.0.1";
    UdpAnySourceMulticastClient _client = null;
    bool _joined = false;
    private byte[] _receiveBuffer;
    private const int MAX_MESSAGE_SIZE = 512;
    public MachineDetector()
    {
        _client = new UdpAnySourceMulticastClient(IPAddress.Parse(MULTICAST_GROUP_ADDRESS), UDP_PORT);
        _receiveBuffer = new byte[MAX_MESSAGE_SIZE];
        _client.BeginJoinGroup(
            result =>
            {
                _client.EndJoinGroup(result);
                _client.MulticastLoopback = false;
                SendRequest();
            }, null);
    }
    private void SendRequest()
    {
        byte[] requestData = Encoding.UTF8.GetBytes("WP7 Multicast");
        _client.BeginSendToGroup(requestData, 0, requestData.Length,
            result =>
            {
                _client.EndSendToGroup(result);
                Receive();
            }, null);
    }
    private void Receive()
    {
        Array.Clear(_receiveBuffer, 0, _receiveBuffer.Length);
        _client.BeginReceiveFromGroup(_receiveBuffer, 0, _receiveBuffer.Length,
            result =>
            {
                IPEndPoint source;
                _client.EndReceiveFromGroup(result, out source);
                string dataReceived = Encoding.UTF8.GetString(_receiveBuffer, 0, _receiveBuffer.Length);
                string message = String.Format("[{0}]: {1}", source.Address.ToString(), dataReceived);
                Console.WriteLine(message);
                Receive();
            }, null);
    }
}

我可以用桌面客户端接收数据,但WP7应用程序似乎无法接收响应。我已经有一段时间了,不知道还能去哪里看。任何帮助都会很棒。

那么,为什么WP7应用程序没有收到回复,有什么建议吗?

如何从UDPClient响应UDP多播

我认为问题出在C# Desktop Client中的ConnectionListener:ReceiveCallback

    _listener.BeginSend(response, response.Length,
         receiveEndpoint, SendCallback, null);

而是调用

    _listener.BeginSend(response, response.Length,
        SendCallback, null);

这将导致消息被发送到多播地址。有关此方面的进一步帮助,请参阅如何:在Windows Phone的多播组中发送和接收数据。

WP7需要向网络进行多播,以便在一次扫描中有效地访问所有桌面客户端。对于客户端响应,唯一的目标是WP7。因此,多播在这里没有真正的优势(因为调谐到多播的桌面客户端实际上会忽略它)。

相反,您可以使用由ConnectionListener:ReceiveCallback中对EndReceive的调用填充的receiveEndpoint来向WP7服务器发送unicast响应。建议使用consideration在MSDN上创建多播应用程序。

这样,WP7不再需要为传入多播join多播组,并且桌面客户端不需要send多播来响应。