ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C# 网络相关 API 汇总:Socket / TcpListener / TcpClient / UdpClient

C# 网络相关 API 汇总:Socket / TcpListener / TcpClient / UdpClient 一、整体层级架构核心认知从底层到上层依次递进所有高层类均基于原生Socket封装原生底层SocketTCP/UDP通用自由度最高高层封装TCP体系TcpListener服务端监听、TcpClient客户端通信UDP体系UdpClient无连接报文通信Modbus协议层NModbus4基于TcpClient/串口封装专属工业协议核心区别TCP面向连接、可靠有序、存在粘包问题UDP无连接、不可靠、无粘包、单报文单次收发NModbus4仅支持TCP/串口RTU/ASCII不支持UDP通用命名空间// 基础网络 using System.Net; using System.Net.Sockets; // NModbus4 工业协议 using Modbus.Device; using Modbus.Data;二、原生 Socket 全套API同步异步1. 构造方法// TCP 套接字 new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // UDP 套接字 new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);2. TCP 核心方法同步方法Bind()绑定本机IP和端口服务端必备Listen(int backlog)开启TCP监听Accept()阻塞等待客户端连接返回新通信SocketConnect()客户端连接服务端Send()/Receive()收发字节数据异步 Task 方法推荐TaskSocket AcceptAsync(SocketAsyncEventArgs e); Task ConnectAsync(EndPoint remoteEP); Task ConnectAsync(string host, int port); Taskint SendAsync(ArraySegmentbyte buffer, SocketFlags socketFlags); Taskint ReceiveAsync(ArraySegmentbyte buffer, SocketFlags socketFlags);3. UDP 核心方法UDP无连接无需握手支持指定远端收发同步方法Bind()绑定本地端口接收数据必备SendTo(byte[], IPEndPoint)指定地址发送报文ReceiveFrom(byte[], ref IPEndPoint)接收并获取发送方地址Connect()锁定远端地址简化后续收发异步 Task 方法Taskint SendToAsync(ArraySegmentbyte buffer, SocketFlags socketFlags, EndPoint remoteEP); Taskint ReceiveFromAsync(ArraySegmentbyte buffer, SocketFlags socketFlags, EndPoint remoteEP);4. Socket 通用方法Shutdown(SocketShutdown.Both)优雅关闭收发通道Close()/Dispose()释放套接字资源SetSocketOption()设置超时、缓冲区、端口复用等三、TCP 高层封装TcpListener服务端1. 核心功能封装Socket的BindListen专门用于TCP服务端监听不直接收发数据2. 全套API同步Start()、Stop()异步TaskTcpClient AcceptTcpClientAsync(); TaskSocket AcceptSocketAsync();使用流程Start() → 异步Accept获取客户端通道 → 基于TcpClient通信四、TCP 高层封装TcpClient客户端/会话通道1. 核心功能封装TCP连接和数据流是NModbus4 TCP主站的核心依赖2. 全套API同步Connect()、Close()、GetStream()异步连接方法Task ConnectAsync(string host, int port); Task ConnectAsync(IPAddress address, int port); Task ConnectAsync(IPAddress[] addresses, int port);数据流异步读写NetworkStreamNetworkStream stream tcpClient.GetStream(); Taskint ReadAsync(byte[] buffer, int offset, int count); Task WriteAsync(byte[] buffer, int offset, int count);常用属性Connected连接状态、Client获取底层原生Socket五、UDP 高层封装UdpClient1. 核心功能简化UDP报文收发无连接模式单报文独立传输无粘包2. 全套API同步Send()、Receive()、Connect()、Close()异步核心方法TaskUdpReceiveResult ReceiveAsync(); Taskint SendAsync(byte[] datagram, int bytes); Taskint SendAsync(byte[] datagram, int bytes, IPEndPoint endPoint);备注UdpReceiveResult 包含 Buffer数据、RemoteEndPoint发送方地址六、NModbus4 全套异步API工业Modbus TCP/RTU1. 核心角色说明ModbusIpMasterModbus TCP 主站客户端主动读写设备ModbusSerialMasterModbus RTU/ASCII 串口主站ModbusTcpSlaveModbus TCP 从站服务端模拟设备关键限制NModbus4不支持UDP无任何UDP相关封装2. ModbusIpMaster 全套异步读写API最常用// 01 读线圈 Taskbool[] ReadCoilsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); // 02 读离散输入 Taskbool[] ReadInputsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); // 03 读保持寄存器 Taskushort[] ReadHoldingRegistersAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); // 04 读输入寄存器 Taskushort[] ReadInputRegistersAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); // 05 写单个线圈 Task WriteSingleCoilAsync(byte slaveAddress, ushort address, bool value); // 06 写单个保持寄存器 Task WriteSingleRegisterAsync(byte slaveAddress, ushort address, ushort value); // 15 写多个线圈 Task WriteMultipleCoilsAsync(byte slaveAddress, ushort startAddress, bool[] values); // 16 写多个保持寄存器 Task WriteMultipleRegistersAsync(byte slaveAddress, ushort startAddress, ushort[] values); // 拓展小众接口 Taskbyte ReadExceptionStatusAsync(byte slaveAddress); TaskModbusCommEvent ReadCommEventCounterAsync(byte slaveAddress); TaskModbusSlaveIdentity ReportSlaveIdentityAsync(byte slaveAddress);3. Modbus 主站创建方式// 方式1内部自动创建TcpClient最简 ModbusIpMaster master ModbusIpMaster.CreateIp(127.0.0.1, 502); // 方式2复用自定义TcpClient推荐可控连接生命周期 TcpClient tcp new TcpClient(); await tcp.ConnectAsync(127.0.0.1, 502); ModbusIpMaster master ModbusIpMaster.CreateIp(tcp); // 超时配置 master.Transport.ReadTimeout 1500; master.Transport.WriteTimeout 1500;4. Modbus 从站SlaveAPI从站无异步读写接口直接操作内存寄存器同步运行// 创建从站并启动监听 ModbusTcpSlave slave ModbusTcpSlave.CreateTcp(1, IPAddress.Any, 502); slave.DataStore ModbusDataStoreFactory.CreateDefault(); slave.Listen(); // 直接操作寄存器 slave.DataStore.HoldingRegisters[0] 100; slave.DataStore.CoilDiscretes[0] true; // 停止服务 slave.Stop(); slave.Dispose();5. Modbus RTU 串口主站方法签名与TCP主站完全一致仅创建方式不同ModbusSerialMaster rtuMaster ModbusSerialMaster.CreateRtu(serialPort); // 同样调用 ReadXXXAsync / WriteXXXAsync 系列方法七、核心使用注意事项高频避坑粘包问题TCP、TcpClient、Modbus TCP均存在粘包需手动分包UDP无粘包UDP限制NModbus4不支持Modbus UDP如需使用需手动基于UdpClient拼装解析报文版本区分ModbusIpMasterTCP无CRC、ModbusSerialMasterRTU带CRC不可混用连接管理NModbus4依赖TcpClient连接连接断开后需重新创建主站无法自动重连异常处理所有Async方法超时、断线、设备异常均会抛异常必须try-catch资源释放TcpClient、UdpClient、Modbus主从站均需Dispose释放套接字资源SlaveId规则Modbus TCP常规设备SlaveId填1串口RTU需严格匹配设备地址八、最终层级速查表类名通信模式核心异步方法适配NModbus4Socket(TCP)底层TCPAcceptAsync、ConnectAsync、SendAsync、ReceiveAsync需包装为TcpClientSocket(UDP)底层UDPSendToAsync、ReceiveFromAsync不支持TcpListenerTCP服务端监听AcceptTcpClientAsync支持自定义从站TcpClientTCP客户端ConnectAsync、ReadAsync、WriteAsync✅ 核心依赖UdpClientUDP报文通信ReceiveAsync、SendAsync不支持ModbusIpMasterModbus TCP主站全系列Read/WriteAsync——ModbusTcpSlaveModbus TCP从站无异步接口——
返回列表