UDP 10054 解决办法!

在使用UDP实现P2P打洞中的NAT设备类型检测时遇到错误10054的问题,经过调查发现这是WINSOCK的一个BUG,并找到了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最经用UDP 写P2P 打洞中的NAT 设备类型检测程序,但是,在一些模块的编写测试过程中发现在一些用户的机器上运行的是很UDP 接受数据会报错10054 ,百思不得其解,最后在网上找到了,原来是WINSOCK得BUG ,郁闷!解决办法:

http://support.microsoft.com/kb/263823/en-us/

### 如何解决网络通信中TCP UDP协议的粘包与分包问题 #### 使用固定长度的消息格式 一种方法是在设计应用层协议时规定每条消息具有固定的长度。这种方式可以简化解析逻辑,因为接收端只需要按预设字节数读取消息即可[^3]。 对于这种场景下的编码解码操作,Netty框架提供了一个名为`FixedLengthFrameDecoder`的类来帮助开发者轻松实现基于定长帧传输的应用程序开发工作。该组件能够自动处理边界情况——即当单次I/O事件未能携带完整的一帧数据或是包含了多于一帧的内容时,它会负责暂存不完全的数据片段直至收集齐所需数量为止;反之则依次分割出一个个独立的信息单元供后续业务流程调用。 ```java // 创建一个 FixedLengthFrameDecoder 实例,指定每一帧的大小为 64 字节 new FixedLengthFrameDecoder(64); ``` #### 添加特殊分隔符作为消息界限标记 另一种常见的策略是向各条记录之间插入独一无二且不会出现在实际载荷里的字符序列充当结束标志位(例如回车换行组合`\r\n`),从而使得远端可以根据这些特征定位到各个独立项的位置关系并据此完成组装过程[^1]。 这种方法适用于那些难以定义统一尺寸规格的情况,并且易于理解和维护。然而需要注意的是,在选取终止符之前应当充分考虑其是否会干扰正常通讯内容本身的意义表达以及是否存在潜在冲突风险等问题。 #### 应用自定义头部结构指明有效负载详情 更进一步地讲,还可以通过构建更为复杂的首部字段体系来传递有关主体部分的关键属性描述信息给对方知晓,比如总字数统计值、校验和计算结果等辅助参数均有助于提高整个系统的健壮性和可靠性水平[^2]。 具体来说就是在每次打包前先附加一段包含上述元数据的小段落置于最前端位置处,随后再跟随真正意义上的净荷成分一起发出;而在另一侧接收到之后便依据此线索来进行相应的验证判断动作以确认无误后再做下一步骤的操作处理。 ```python def create_message_with_header(payload, length_field_size=4): """创建带有头部的消息""" payload_length = len(payload).to_bytes(length_field_size, byteorder='big') return payload_length + bytes(payload, 'utf-8') def read_exactly(sock, n): """从套接字中精确读取n个字节""" data = bytearray() while len(data) < n: packet = sock.recv(n - len(data)) if not packet: raise EOFError('Unexpected connection close.') data.extend(packet) return data def receive_message_with_header(sock, length_field_size=4): """根据头部接收完整的消息""" header = int.from_bytes(read_exactly(sock, length_field_size), byteorder='big') message = read_exactly(sock, header).decode('utf-8') return message ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值