如何通过UDPClient响应UDP多播

3

首先声明一下,我对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 应用程序无法接收响应?
2个回答

0

我认为问题出在 C#桌面客户端 中的 ConnectionListener:ReceiveCallback

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

改为调用

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

这将导致消息被发送到多播地址。如需进一步帮助,请参考 Windows Phone 中如何在多播组中发送和接收数据的操作指南。


@AlRodriguez 你说得对。MSDN中关于BeginSend的说明是“必须先调用Connect方法指定目标”,但同时也强调了“如果你要接收多播数据报,请不要调用Connect方法”。 - user1055604

0

WP7需要通过组播来高效地一次性覆盖所有桌面客户端。对于客户端响应,唯一的目标是WP7。因此,在这里组播没有真正的优势(因为调入组播的桌面客户端将有效地忽略它)。

相反,您可以使用receiveEndpoint通过对ConnectionListener:ReceiveCallback中的EndReceive的调用进行填充,向WP7服务器发送单播响应。这是在创建组播应用程序时推荐的考虑事项,详情请参见MSDN

这样,WP7就不再需要加入传入组播组,而桌面客户端也无需发送组播以响应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接