Winsock 下罕见的 sendto()/recvfrom() 问题的原因?

Reasons for rare sendto()/recvfrom() issues under Winsock?

我们最近观察到罕见的 UDP 通信问题,这些问题表现出以下症状:

  1. 套接字 sendto() 调用失败并出现错误 WSAENOBUFS (10055)
  2. 此套接字上的后续 recvfrom() 调用未收到任何内容,即使 Wireshark 显示网络接口实际收到了预期的数据报。这种情况持续了大约 8 秒,之后 传入的数据报可以再次从套接字接收。
  3. 在 Windows 系统日志中,出现 Kernel-General 信息条目时出现 sendto() 错误: The access history in hive \??\C:\ProgramData\Microsoft\Provisioning\Microsoft-Desktop-Provisioning-Sequence.dat was cleared updating 0 keys and creating 0 modified pages.

问题发生在客户系统上 运行 Microsoft Windows 10 Pro for Workstations,版本 10.0.17763 Build 17763。

在该系统上,我们能够使用一个用 C++ 编写的简单测试程序重现该问题,该程序回显 UDP 数据报。通过使用 SO_RCVTIMEO 指定 1 秒的超时,打印一些“仍然存在”的输出并立即再次调用 recvfrom(),我们验证了从套接字接收的线程实际上一直在响应。

在我们自己的测试系统上,我们无法在与客户相同的情况下观察到该问题。但是,在测试 运行 时,我们在使用网络适配器设置时能够引发类似的效果。启用 Microsoft LLDP Protocol Driver 显示 sendto() 错误,有时还会导致 8 秒的“静默”期,但没有任何 Windows 系统日志条目。

非常感谢任何提示。

自 Windows 10 1809 以来,该问题似乎与 Microsoft Provisioning Tool 有关。

禁用它解决了我们案例中的问题:

Open Task Scheduler, go to Microsoft/Windows/Manangement/Provisioning and disable Logon task.

来源:Windows TenForums