C# UDP многоадресный прием не работает (asyn c или syn c) - PullRequest
0 голосов
/ 16 апреля 2020

Я добавляю функцию многоадресного прослушивания для разрабатываемого приложения. Устройство, к которому я подключаюсь, будет отправлять многоадресный пакет каждую секунду в определенном сценарии ios, и я бы хотел, чтобы пользователь мог прослушивать этот пакет (если он отправляется).

Я вижу, как многоадресные пакеты непрерывно отправляются с устройства с помощью Wireshark, поэтому я знаю, что они существуют, и я знаю, что использую правильную группу многоадресной рассылки и номер порта. Я попробовал дюжину разных способов, но мне не повезло, что мое приложение перехватило пакеты. Если я отправляю тестовый пакет многоадресной рассылки из самого приложения, оно получает его без проблем. Я пытался получить пакеты как asyn c и syn c, без изменений. Я действительно зашла в тупик и не уверена, что делаю неправильно. Каждый найденный мной пример наводит меня на мысль, что это должно сработать.

Мой класс прослушивателя udp для многоадресной рассылки:

   class MulticastClient
{
    private UdpClient client;
    private IPEndPoint localEp;
    private IPAddress multicastAddress;

    public byte[] receivedData { get; private set; }

    public MulticastClient(string multicastIP, int port)
    {
        localEp = new IPEndPoint(IPAddress.Any, port);
        client = new UdpClient(AddressFamily.InterNetwork);

        client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        client.ExclusiveAddressUse = false;

        client.Client.Bind(localEp);

        this.multicastAddress = IPAddress.Parse(multicastIP);
        client.JoinMulticastGroup(this.multicastAddress);            
    }

    public async Task Listen()
    {
        UdpReceiveResult result = await client.ReceiveAsync();
        receivedData = result.Buffer;    
    }
}

Нажатие кнопки, которое запускает его:

MulticastClient client = new MulticastClient("239.255.0.1", 32768);

        await Task.Run(async () =>
        {
            await client.Listen();
        });

        byte[] receivedData = client.receivedData;

        if (receivedData != null)
        {
            //Here I display useful information about the packet to the user
        }

Вот фрагмент захвата пакета, показывающий многоадресные пакеты, которые я не могу получить: Захват пакета Wireshark

1 Ответ

0 голосов
/ 17 апреля 2020

Получил это, используя вариацию этого поста.

@ jdweng заставил меня понять, когда он / она спросил о нескольких адаптерах, у меня было несколько виртуальных сетевых карт для виртуальных машин, которые были скорее всего, присоединение к группе многоадресной рассылки ht вместо моего реального оборудования NI C.

...