Как правильно отправить пакет udp в c# WinForms? - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь отправить строку на другое устройство в моей локальной сети, используя UDP в c#. Для GUI я использую формы windows. У меня есть кнопка в моем GUI, которая при нажатии вызывает следующий метод:

        private void Send_btn_Click(object sender, EventArgs e)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            IPAddress serverAddr = IPAddress.Parse("192.168.1.15");

            IPEndPoint endPoint = new IPEndPoint(serverAddr, 5000);

            string text = "Sample text";
            byte[] send_buffer = Encoding.ASCII.GetBytes(text);

            sock.SendTo(send_buffer, endPoint);


        }

Однако, когда я запускаю программу и нажимаю кнопку без каких-либо ошибок, появляется окно GUI теряет фокус, и единственный способ восстановить фокус - нажать кнопку «Продолжить» в Visual Studio Community 2019. Не только это, но и пакет udp не отправляется вообще. Что я делаю не так? enter image description here

1 Ответ

0 голосов
/ 08 мая 2020

Лично я бы использовал класс BackgroundWorker для отправки данных.

Пользовательский интерфейс не зависнет, и сообщение будет отправлено в фоновом режиме.

Просто добавьте BackgroundWorker из toolbox

В вашем случае это будет примерно так:

private void Send_btn_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, EventArgs e)
{
    Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    IPAddress serverAddr = IPAddress.Parse("192.168.1.15");
    IPEndPoint endPoint = new IPEndPoint(serverAddr, 5000);
    string text = "Sample text";
    byte[] send_buffer = Encoding.ASCII.GetBytes(text);

    sock.SendTo(send_buffer, endPoint);
}

Ваш класс Designer будет иметь что-то вроде этого:

this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);

Если вам нужен уведомление или что-то в этом роде, вы можете просто обработать событие RunWorkerCompleted.

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