c# - 如何在 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 数据包。我究竟做错了什么?
解决方案
就个人而言,我会使用 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 事件的处理程序处。
推荐阅读
- excel - VBA 代码在 Excel 2010 中可以快速完美地运行,但在 Excel 2016 或更高版本中添加一条记录需要 30 秒
- typescript - 在 .eslintrc.json 中设置规则选项
- office-js - Outlook OfficeJS API context.mailbox.item.body.getAsync 方法不会随机返回正文
- julia - 为什么 Julia 中默认不可变结构?
- java - Vertx 在 html 中使用上传的图片
- c# - Dapper 从存储过程返回打印消息
- python - 如何使用 del 和 indices 从列表中删除元素
- javascript - 嵌套地图无法渲染
主循环中的元素 - python - 如何优化 Python 中的 groupby.apply(function)?
- python - Keras:改变学习率