Как ответить на UDP Multicast от UDPClient - PullRequest
3 голосов
/ 11 марта 2012

Я хочу предвосхитить это, сказав, что мое понимание UDP Broadcasting and Multicasting очень ограничено.Это мой первый проект, работающий над этим.

У меня есть настольный клиент 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 голосов
/ 14 марта 2012

WP7 требуется для многоадресной рассылки в сеть, чтобы эффективно охватить все настольные клиенты за один раз.Для ответа клиента единственным предполагаемым местом назначения является WP7.Таким образом, многоадресная рассылка здесь не имеет реального преимущества (поскольку настроенные на многоадресную рассылку клиенты рабочего стола будут фактически игнорировать ее).

Вместо этого вы можете использовать receiveEndpoint, заполненный вызовом EndReceive in ConnectionListener:ReceiveCallback для отправки ответа unicast на сервер WP7.Рекомендуется consideration для создания многоадресных приложений на MSDN .

Таким образом, WP7 больше не нужно join группа многоадресной рассылки для входящей многоадресной рассылки, а клиенту рабочего стола не нужно send многоадресная передача для ответа.

0 голосов
/ 11 марта 2012

Я думаю, что проблема с ConnectionListener:ReceiveCallback в C# Desktop Client.

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

Вместо вызова

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

Это приведет к отправке сообщения на адрес многоадресной рассылки.Подробнее об этом см. Как: отправлять и получать данные в многоадресной группе для Windows Phone.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...