【问题标题】:Windows 7 temporarily routes UDP packets for local network to default gatewayWindows 7 临时将本地网络的 UDP 数据包路由到默认网关
【发布时间】:2016-03-04 10:27:31
【问题描述】:

我有一个运行在多宿主 Windows 7 机器上的 Windows 服务,它通过 UDP 与本地网络上的机器进行通信。这工作正常,除了有时在 Windows 启动期间网络流量暂时(30 秒)被路由到默认网关,导致 UDP 数据包丢失。这种丢包不一定是问题,但会导致应用程序的启动时间过长。

服务使用 INADDR_ANY 绑定到套接字。现在,当我将其更改为绑定到控制网络 NIC (192.168.32.1) 的 IP 地址时,我没有发现问题。但是我不明白为什么在这种情况下绑定很重要,我也不明白为什么问题只是暂时存在。你们中有人对此有解释吗?

除了我想找到这个问题的根本原因之外,我还想得到这个问题的答案,这样我就可以从我的代码中删除对特定 IP 地址的绑定。这将我的应用程序代码与网络布局分离。

网络详情:

  • 机器 A,Windows 7,两个 NIC:
    • NIC #1(外部网络):192.168.116.x/23 (DHCP),网关 192.168.117.1
    • NIC #2(int 网络):192.168.32.1/26(固定)
  • 机器 B,VxWorks,一个 NIC:
    • NIC #1(int 网络):192.168.32.16/26(DHCP,由机器 A 分配)

【问题讨论】:

    标签: sockets networking windows-7 udp ip


    【解决方案1】:

    使用 INADDR_ANY 时,您将套接字绑定到默认 IP 地址 - 具有最低接口地址的地址。从您描述的症状来看,启动时似乎尚未配置此接口,这是有道理的。

    问题是,为什么要将发送套接字绑定到任何地址。 send 期间的隐式绑定对你来说应该没问题,我想?

    【讨论】:

    • 未绑定数据报套接字上的第一个 sendto() 将相当于 INADDR_ANY 的 bind(),因此结果行为将是相同的。
    • @keithmo 会吗?是否指定以这种方式表现?由于它是操作系统的深层内部结构,如果得知它不会绑定到 INADDR_ANY,而是绑定到第一个可用接口,并且 INADDR_ANY 被视为不可用,我不会感到惊讶。不确定。
    • sendto (msdn.microsoft.com/en-us/library/windows/desktop/…) 的 MSDN 文档有点神秘。他们说“如果打开套接字,调用 setsockopt,然后调用 sendto,Windows Sockets 执行隐式绑定函数调用。”,这很奇怪(setsockopt 与此无关)。然后他们说“如果套接字未绑定,系统会为本地关联分配唯一值,然后将套接字标记为绑定。”
    • FWIW,我共同编写了几个 Winsock 实现(包括 Windows 95 附带的 Winsock 1.1 和 NT 4.0 附带的 Winsock 2.2),我主持了 Winsock 2 的“架构框架”委员会标准化工作。也就是说,我对此的直接了解有点陈旧——MS 可能在以后的 Windows 版本中改变了这种行为,所以请谨慎对待。
    • @keithmo,所以是你无缘无故地给所有 BSD 函数加上了这个可怕的 WSA 前缀?很高兴知道!
    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2016-05-07
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多