🔌 UDP 传输
命名空间: Snet.Core.communication.net.udp.unicast.client / Snet.Core.communication.net.udp.unicast.service / Snet.Core.communication.net.udp.multicast / Snet.Core.communication.net.udp.broadcast | 类: UdpClientOperate, UdpServiceOperate, UdpMulticastOperate, UdpBroadcastOperate
UdpClientOperate — UDP 单播客户端
继承: CommunicationAbstract<UdpClientOperate, UdpClientData.Basics>
| 配置 | 类型 | 默认值 | 说明 |
|---|---|---|---|
IpAddress |
string |
"127.0.0.1" |
远程 IP |
Port |
int |
6688 |
远程端口 |
LocalPort |
int |
0 |
本地绑定端口 (0=自动) |
InterruptReconnection |
bool |
true |
自动重连 |
ReconnectionInterval |
int |
1000 |
重连间隔 (ms) |
Timeout |
int |
1000 |
I/O 超时 (ms) |
SendWaitInterval |
int |
5000 |
发送等待超时 (ms) |
MaxChunkSize |
int |
261120 |
单数据报最大字节数 |
RetrySendCount |
int |
5 |
发送重试次数 |
UDP 数据报不分包:载荷必须 ≤ Math.Min(MaxChunkSize, 60 * 1024) 字节(UDP 安全载荷上限),否则发送失败。使用 UdpClient.Connect() 建立关联单播套接字;重连采用相同指数退避(500ms × 2ⁿ ms,n 为重试次数,上限 30s)。
using Snet.Core.communication.net.udp.unicast.client;
var udp = await UdpClientOperate.InstanceAsync(new Basics { IpAddress = "192.168.1.100", Port = 6688 });
await udp.OnAsync();
await udp.SendAsync(data);
await udp.OffAsync();
UdpServiceOperate — UDP 单播服务端
继承: CommunicationServiceAbstract<UdpServiceOperate, UdpServiceData.Basics>
单一 ReceiveLoopAsync 自动发现客户端端点。已知客户端由 ConcurrentDictionary<string, UdpClientSession> 管理,键为 "IP:端口";UdpClientSession 封装 IPEndPoint 端点与最后活跃时间。独立清理循环移除空闲超过 ClientTimeout(默认 60000 ms,检查间隔 = max(ClientTimeout / 3, 5000) ms)的客户端并触发断开事件。发送为单数据报(载荷 ≤ Math.Min(MaxChunkSize, 60 * 1024) 字节,且发送字节数须等于载荷长度)。
using Snet.Core.communication.net.udp.unicast.service;
var server = await UdpServiceOperate.InstanceAsync(new Basics { Port = 6688 });
await server.OnAsync();
await server.SendAsync(data); // 群发
await server.SendAsync(data, "192.168.1.10:5000"); // 单播
await server.OffAsync();
UdpMulticastOperate — UDP 组播
继承: CommunicationAbstract<UdpMulticastOperate, UdpMulticastData.Basics>
| 配置 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Port |
int |
6688 |
本地绑定端口 |
MulticastAddress |
string |
"239.0.0.1" |
组播组地址 |
MulticastPort |
int |
8866 |
目标端口 (0=使用Port) |
TimeToLive |
short |
1 |
TTL (0=本机,1=子网) |
Timeout |
int |
1000 |
I/O 超时 (ms) |
SendWaitInterval |
int |
5000 |
发送等待超时 (ms) |
MaxChunkSize |
int |
261120 |
单数据报最大字节数 |
RetrySendCount |
int |
5 |
发送重试次数 |
JoinMulticastGroup/DropMulticastGroup,ReuseAddress,全接口绑定 IPAddress.Any。数据报不分包:载荷必须 ≤ Math.Min(MaxChunkSize, 60 * 1024) 字节,否则发送失败。
using Snet.Core.communication.net.udp.multicast;
var mc = await UdpMulticastOperate.InstanceAsync(new Basics {
Port = 6688, MulticastAddress = "239.0.0.1", TimeToLive = 1
});
await mc.OnAsync();
await mc.SendAsync(data);
await mc.OffAsync();
UdpBroadcastOperate — UDP 广播
继承: CommunicationAbstract<UdpBroadcastOperate, UdpBroadcastData.Basics>
| 配置 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Port |
int |
6688 |
本地绑定端口 |
BroadcastAddress |
string |
"255.255.255.255" |
广播地址 |
BroadcastPort |
int |
8866 |
目标端口 (0=使用Port) |
Timeout |
int |
1000 |
I/O 超时 (ms) |
SendWaitInterval |
int |
5000 |
发送等待超时 (ms) |
MaxChunkSize |
int |
261120 |
单数据报最大字节数 |
RetrySendCount |
int |
5 |
发送重试次数 |
EnableBroadcast = true,ReuseAddress,IPAddress.Any 绑定。数据报不分包:载荷必须 ≤ Math.Min(MaxChunkSize, 60 * 1024) 字节,否则发送失败。
using Snet.Core.communication.net.udp.broadcast;
var bc = await UdpBroadcastOperate.InstanceAsync(new Basics {
Port = 6688, BroadcastAddress = "255.255.255.255"
});
await bc.OnAsync();
await bc.SendAsync(data);
await bc.OffAsync();
