首页 > 解决方案 > 如何在 c# WinForms 中正确发送 udp 包?

问题描述

我正在尝试使用 c# 中的 UDP 将字符串发送到本地网络中的另一个设备。对于 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 数据包。我究竟做错了什么? 在此处输入图像描述

标签: c#winformsudp

解决方案


就个人而言,我会使用 BackgroundWorker 类来发送数据。

UI 不会冻结,消息将在后台发送。

只需从工具箱中添加 BackgroundWorker

对于您的情况,它将是这样的:

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 事件的处理程序处。


推荐阅读