ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

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

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 IPV4GetIPProperties获取该网络接口的属性包含网关、DHCP信息UnicastAddresses包含所有的单播地址信息同时包含IPV4、IPV6(AddressFamily.InterNetworkV6) FirstOrDefault(); // DHCP 动态主机配置协议网络设备自动获取IP、子网掩码、网关等信息二、 修改本机IPstring[] parts targetIp.Split[.]; // targetIp为已知的外部设备IP string clientIp ${parts[0]}.{parts[1]}.{parts[2]}.{100}; // clientIp为上位机(Tcp客户端)的新IP100那里自行添加自增逻辑什么的 // 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自动分配IPnetsh 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自动分配IPip addr flash dev {interface.Name}三、 建立TCP连接同上
返回列表