跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp UDP 编程
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C# UDP编程 = '''用户数据报协议(UDP)'''是一种无连接的传输层协议,与TCP不同,它不保证数据包的顺序或可靠性,但具有低延迟和高吞吐量的特点。C#通过{{mono|System.Net.Sockets}}命名空间提供了UDP编程的支持,适用于实时性要求高的应用,如视频流、在线游戏和DNS查询。 == UDP基础 == UDP通信基于'''数据报'''(datagram),每个数据包独立传输。关键特点包括: * '''无连接''':无需建立持久连接。 * '''不可靠''':不保证数据包到达或顺序。 * '''轻量级''':头部仅8字节(TCP为20字节)。 === 与TCP对比 === {| class="wikitable" |- ! 特性 !! UDP !! TCP |- | 连接类型 || 无连接 || 面向连接 |- | 可靠性 || 不可靠 || 可靠(重传机制) |- | 顺序保证 || 无 || 有 |- | 速度 || 快 || 较慢 |- | 适用场景 || 实时应用 || 文件传输/Web |} == C# UDP核心类 == 主要使用以下类: * {{mono|UdpClient}}:简化UDP操作 * {{mono|IPEndPoint}}:表示网络端点(IP+端口) === 基本通信流程 === <mermaid> sequenceDiagram participant Client participant Server Client->>Server: 发送数据报(无连接建立) Server->>Client: 可选响应 </mermaid> == 代码实现 == === 发送数据 === <syntaxhighlight lang="csharp"> using System; using System.Net; using System.Net.Sockets; using System.Text; class UDPSender { static void Main() { // 创建UdpClient(自动分配本地端口) using UdpClient sender = new UdpClient(); // 目标地址和端口 IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 11000); // 发送数据 string message = "Hello UDP!"; byte[] data = Encoding.ASCII.GetBytes(message); sender.Send(data, data.Length, remoteEP); Console.WriteLine($"Sent: {message}"); } } </syntaxhighlight> === 接收数据 === <syntaxhighlight lang="csharp"> using System; using System.Net; using System.Net.Sockets; using System.Text; class UDPReceiver { static void Main() { // 绑定到本地端口 using UdpClient receiver = new UdpClient(11000); // 接收来自任意发送方的数据 IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); byte[] data = receiver.Receive(ref remoteEP); string message = Encoding.ASCII.GetString(data); Console.WriteLine($"Received {data.Length} bytes from {remoteEP}: {message}"); } } </syntaxhighlight> == 高级特性 == === 异步操作 === 使用{{mono|async/await}}实现非阻塞通信: <syntaxhighlight lang="csharp"> async Task ReceiveAsync() { using UdpClient client = new UdpClient(11000); while (true) { UdpReceiveResult result = await client.ReceiveAsync(); string message = Encoding.ASCII.GetString(result.Buffer); Console.WriteLine($"Async received: {message}"); } } </syntaxhighlight> === 多播(Multicast) === 实现一对多通信: <syntaxhighlight lang="csharp"> void JoinMulticastGroup() { UdpClient client = new UdpClient(11000); client.JoinMulticastGroup(IPAddress.Parse("224.0.0.1")); // 接收逻辑与普通UDP相同 } </syntaxhighlight> == 实际应用案例 == === 网络游戏位置同步 === 典型UDP数据包结构(简化): <mermaid> classDiagram class PlayerPositionPacket { +int PlayerId +float X +float Y +float Z +long Timestamp } </mermaid> 代码实现: <syntaxhighlight lang="csharp"> public struct PlayerPositionPacket { public int PlayerId; public float X, Y, Z; public long Timestamp; public byte[] Serialize() { byte[] buffer = new byte[24]; // 4 + 12 + 8 BitConverter.GetBytes(PlayerId).CopyTo(buffer, 0); // 其他字段类似处理... return buffer; } } </syntaxhighlight> == 错误处理 == 常见异常及处理方式: * {{mono|SocketException}}:网络错误(如端口占用) * {{mono|ObjectDisposedException}}:UdpClient已关闭 * {{mono|ArgumentNullException}}:参数为空 示例处理代码: <syntaxhighlight lang="csharp"> try { // UDP操作代码 } catch (SocketException ex) { Console.WriteLine($"Network error: {ex.SocketErrorCode}"); } </syntaxhighlight> == 性能优化 == * '''缓冲区重用''':避免频繁分配内存 * '''批处理''':合并小数据包 * '''MTU注意''':以太网MTU通常为1500字节(包括IP头) 计算公式: <math> 有效载荷_{max} = MTU - IP_{头} - UDP_{头} = 1500 - 20 - 8 = 1472 \text{字节} </math> == 安全考虑 == * '''数据验证''':检查来源IP(防止IP欺骗) * '''加密''':对敏感数据使用AES等算法 * '''速率限制''':防止DDoS攻击 == 总结 == UDP编程在C#中通过{{mono|UdpClient}}类实现,适合低延迟场景。关键要点: * 比TCP更快但不可靠 * 支持同步/异步操作 * 需要手动处理数据包排序和丢失 * 适用于实时应用 {{Note|提示|对于需要可靠性的应用,可在应用层实现ACK机制(如QUIC协议)。}} [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 网络编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Ifsubst
(
编辑
)
模板:Mono
(
编辑
)
模板:Mono/styles.css
(
编辑
)
模板:Note
(
编辑
)