发送UDP报文时出现地址不可达错误的问题求助
问题根因与解决方案
核心问题所在
你遇到的报错是由SocketOptionName.DontRoute配置导致的,该参数的作用是强制操作系统忽略路由表规则,仅允许数据包发送到与当前网卡直连的同一网段目标:
- 你绑定的本地网卡地址是192.168.2.10,属于192.168.2.0/24网段,目标地址192.168.1.10属于192.168.1.0/24网段,跨网段通信原本需要经过网关路由转发,你开启
DontRoute后系统会禁止走网关转发,自然找不到可达路径,抛出网络不可达错误。 - 同网段通信正常完全符合该参数的设计逻辑:同一网段的目标不需要经过网关路由,直连即可送达,不受
DontRoute配置影响。 - 广播报文发送正常的原因是255.255.255.255是本地链路广播地址,本身不需要路由,只会在当前二层广播域内泛洪,所以开启
Broadcast选项后即可正常发送,和DontRoute配置不冲突。
修复方案
- 若你需要实现跨网段UDP通信,直接删除如下配置行即可,操作系统会自动匹配路由表将数据包转发到目标网段:
sender.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontRoute, 1);
- 若你有特殊业务要求必须开启
DontRoute,则只能将通信两端部署在同一个二层广播域(同一网段)内,否则无法完成通信。
内容的提问来源于stack exchange,提问作者Wojciech Szabowicz
相关产品推荐
相关产品推荐

