news 2026/9/8 15:42:45

C# 上位机UDP/TCP连接外部设备

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# 上位机UDP/TCP连接外部设备

连接方式:PC与外部设备使用网线连接同一个路由器,此时路由器通过DHCP给双方分配同网段的IP;

目标:通过UPD探测外部连接设备,获取外部设备的IP,再根据IP建立TCP链接;

一、UDP探测外部设备

UDP(无连接协议)与TCP(三次握手连接状态)不同,UDP的通信双方平等,没有服务端、客户端之分,且UDP通信可以广播,而TCP作为点对点协议,必须先建立连接,因此先用UDP广播获取外部设备IP。

IPEndPoint point = new IPEndPoint(IPAddress.Any, 0); // 监听本机网卡的所有IP地址,设置自身的端口为0 using UdpClient client = new(point) { EnableBroadcast = true }; // 创建UdpClient对象,EnableBroadcast 给所有IP都发信息 byte[] request = Encoding.UTF8.GetBytes("自行定义的字符串"); IPAddress target = IPAddress.Broadcast; await client.SendAsync(request.AsMemory(), new IPEndPoint(target, port)); // 发送双方约定的信息,port为已知的外部设备端口,外部设备不需要知道这边的端口是什么 while(!cancelToken.IsCanceled) { UdpReceiveResult reply = await client.ReceiveAsync(); // 解析reply.Buffer,获取外部设备的IP和Name }

二、TCP连接

外部设备作为TCP的服务端(TcpListener),已固定ip和端口,由上位机作为客户端发送连接请求。

TcpClient client = new TcpClient(); client.ConnectAsync(ip, port, token); // ip为IPAddress对象,由UDP读出来后创建的,port为已经约定好的外部设备端口

连接方式:PC与外部设备通过网线直连,此时PC端需调整IP,让自身与外部设备在同一网段下;

目标:上位机读取自身网卡信息,按照已知的外部设备IP,修正网卡自身IP,实现同一网段,再建立TCP连接;

一、 获取本机网卡对象

- NetworkInterface interface = NetworkInterface.GetAllNetworkInferfaces() // 获取当前操作系统检测到的所有网络接口 .Where(t => t.NetworkInterfaceType == NetworkInterfaceType.Ethernet && // 仅选择物理网卡,筛选掉回环地址、虚拟网卡、WIFI等 t.OperationalStatus == OperationalStatus.Up && // 仅选择已成功链接的网卡 !t.Name.Contains("Npcap", StringComparision.OrdinalIgnoreCase) && // 筛选掉虚拟网卡 !t.Name.Contains("Loopback", StringComparision.OrdinalIgnoreCase) && // 再筛一次回环地址 t.GetIPProperties().UnicastAddresses.Any(p => p.Address.AddressFamily == AddressFamily.InterNetwork)).// 只要InterNetwork IPV4;GetIPProperties:获取该网络接口的属性,包含网关、DHCP信息;UnicastAddresses:包含所有的单播地址信息,同时包含IPV4、IPV6(AddressFamily.InterNetworkV6) FirstOrDefault(); // DHCP 动态主机配置协议:网络设备自动获取IP、子网掩码、网关等信息;

二、 修改本机IP

string[] parts = targetIp.Split['.']; // targetIp为已知的外部设备IP string clientIp = $"{parts[0]}.{parts[1]}.{parts[2]}.{100}"; // clientIp为上位机(Tcp客户端)的新IP,100那里自行添加自增逻辑什么的 // Windows ProcessStartInfo info = new("netsh", $"interface ip set address \"{interface.Name}\" static {clientIp} 255.255.255.0") { UseShellExecute = true, // 修改IP需要管理员权限,UseShellExecute可以获得UAC提权,即临时获取管理员权限 Verb = "runas", // 弹窗提示是否给权限 CreateNoWindow = true // 后台运行 }; using Process process = Process.Start(info); await process.WaitForExitAsync(); var errorCode = process.ExitCode; // errorCode为0就是成功 // 后续恢复DHCP自动分配IP:netsh interface ip set address \"{interface.Name}\" dhcp // Linux ProcessStartInfo info = new("ip", $"addr replace {clientIp}/24 dev {interface.Name} ") // 24为子网掩码长度 { RedirectStandardOutput = true, // Process信息重定向到输出 RedirectStandardError = true // Process信息重定向到错误 }; using Process process = Process.Start(info); await process.WaitForExitAsync(); var errorCode = process.ExitCode; // 后续恢复DHCP自动分配IP:ip addr flash dev {interface.Name}

三、 建立TCP连接

同上;

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 15:36:34

AI Agent开发入门:从原理到实践的工程化指南

1. AI Agent岗位为什么突然这么火?最近半年,我明显感觉到AI Agent岗位的招聘需求暴涨。不管是互联网大厂还是创业公司,都在疯狂招人。很多朋友问我,到底这些岗位在做什么?企业为什么要花高薪招一个“Agent开发工程师”…

作者头像 李华
网站建设 2026/9/8 15:36:24

2026年8月GitHub十大热门项目排行榜深度解析

每个月我都会抽一整个晚上,把 GitHub 的 Trending 页从上到下翻一遍。这个习惯我保持了快十年,倒不是怕错过什么,而是想看看这个月全球的开发者都在解决什么问题、对什么东西最兴奋。2026 年 8 月的热榜尤其有意思——AI 教学类项目、个人数据…

作者头像 李华
网站建设 2026/9/8 15:36:11

AI文字如何去掉“机器味”?一份人性化改写实操指南

如果你经常和AI生成的内容打交道,不管是写文案、做运营、搞自媒体还是写邮件,一定会遇到一个尴尬的场景:机器产出的文字,读起来“太像机器了”。用词工整、逻辑严密,乍一看没毛病,但细一读总觉得少了点“人…

作者头像 李华
网站建设 2026/9/8 15:36:05

嵌入式进阶路线:从FOC电机控制到车规芯片BSP开发

先讲个背景。我是从带电机起步的嵌入式工程师,最开始接触的是用STM32F407控制3508电机做轮腿小车,后来一路做到BLDC无感FOC、CAN总线多轴关节控制,再后来跳到车规级芯片平台做ARM64 Android内核与BSP开发。这条从电机控制走向车规芯片平台开发…

作者头像 李华
网站建设 2026/9/8 15:33:54

01CSS基础03 盒子模型(Box Model)

摘要:本文系统讲解 CSS 盒子模型的核心知识,从块级盒子与行内盒子的区别、盒子模型的四大组成部分,到边框、圆角、内边距、外边距的用法,再到外边距折叠与塌陷、盒子的尺寸计算(box-sizing)、背景、阴影、过…

作者头像 李华