Невозможно получить UDP.BeginReceive для работы в WPF - PullRequest
0 голосов
/ 12 февраля 2019

У меня нет проблем с использованием метода UDPClient BeginReceive из консольного приложения.Однако я не могу запустить его из моего приложения WPF.Я очень смущен.Я предполагаю, что это как-то связано с тем, откуда я вызываю этот код.Я новичок в WPF.Есть ли что-то, что я неправильно понимаю в связывании UDPClient в WPF?

Имеет ли Inheriting from Application что-то, что может помешать UDPClient BeginReceive ()

Теперь этот стек вызовов кода поступает изApp.xaml.cs для ButtonClick(), который создает экземпляр MachineItem и вызывает StartMachine.Никаких странных потоков или чего-то еще (если WPF не делает что-то, о чем я не знаю во время нажатия кнопки).Снова вызывается BeginReceive(), но если я поставлю точку останова в Receive(IAsyncResult res), ничего не произойдет.

public partial class App : Application
{
    //... all the normal stuff here
    private void Button_Click(object sender, RoutedEventArgs e)
    {

        MachineItem currentMachine = (MachineItem)(sender as Button).DataContext;
        currentMachine.StartMachine();
    }
}

Теперь, после нажатия кнопки, это происходит:

public class MachineItem : INotifyPropertyChanged
{
    IPEndPoint sendersEndPoint;
    UdpClient listener;

    public void StartMachine()
    {
        listener = new UdpClient
        {
            ExclusiveAddressUse = false
        };

        listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        IPAddress ip = System.Net.IPAddress.Parse(this.LocalNIC_IPAddress);
        int ipInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
        IPEndPoint endPoint = new IPEndPoint(ipInt, 60811); //new IPEndPoint(IPAddress.Any, listenPort); this might allow me not to know the IP of this local device!
        listener.Client.Bind(endPoint);
        listener.BeginReceive(new AsyncCallback(Receive), null);
        Thread.Sleep(20000); // this is just for testing purposes
    }

    private void Receive(IAsyncResult res)
    {
        byte[] bytes = listener.EndReceive(res, ref sendersEndPoint);
        listener.BeginReceive(new AsyncCallback(Receive), null);
        Console.WriteLine("Received");
    }
}

Обновление: Я попытался поместить этот код UDP туда, где сначала запускается приложение, чтобы еще больше сузить проблему.Я все еще получаю то же самое поведение - клиент может вызывать BeginReceive (), но тогда ничего не происходит, даже когда приходят UDP-пакеты, другими словами, асинхронный метод Receive () никогда не вызывается ...

public partial class WVGUIApp : Application
    {
    IPEndPoint sendersEndPoint;
    UdpClient listener;

    void AppStartup(object sender, StartupEventArgs args)
    {
        LoadMachineData();
        MainWindow mainWindow = new MainWindow();
        mainWindow.Show();

        listener = new UdpClient
        {
            ExclusiveAddressUse = false
        };
        listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        IPAddress ip = System.Net.IPAddress.Parse("10.178.100.111");
        int ipInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
        IPEndPoint endPoint = new IPEndPoint(ipInt, 60811); //new IPEndPoint(IPAddress.Any, listenPort); this might allow me not to know the IP of this local device!
        listener.Client.Bind(endPoint);
        listener.BeginReceive(new AsyncCallback(Receive), null);
        //Thread.Sleep(20000);

    }

    private void Receive(IAsyncResult res)
    {
        byte[] bytes = listener.EndReceive(res, ref sendersEndPoint);
        listener.BeginReceive(new AsyncCallback(Receive), null);
        Console.WriteLine("Received");
    }
}

1 Ответ

0 голосов
/ 14 февраля 2019

Я нашел проблему после многих дней борьбы с этим.Брандмауэр Windows не разрешал отладочную сборку приложения.Мне было трудно это диагностировать, потому что UDPClient.Send () был разрешен, но UDPClient.BeginReceive () не был разрешен через брандмауэр.Это легко исправить в Windows 10, перейдя в Панель управления \ Все элементы панели управления \ Брандмауэр Защитника Windows \ Разрешенные приложения \ и щелкнув название приложения.Релиз версия была допущена до конца, но запись отладки отличается от версии.Спасибо MM8 за помощь в проверке работоспособности.

...