Winsock 下罕见的 sendto()/recvfrom() 问题的原因?
Reasons for rare sendto()/recvfrom() issues under Winsock?
我们最近观察到罕见的 UDP 通信问题,这些问题表现出以下症状:
- 套接字
sendto()
调用失败并出现错误 WSAENOBUFS (10055)
- 此套接字上的后续
recvfrom()
调用未收到任何内容,即使 Wireshark 显示网络接口实际收到了预期的数据报。这种情况持续了大约 8 秒,之后 新 传入的数据报可以再次从套接字接收。
- 在 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.
我们最近观察到罕见的 UDP 通信问题,这些问题表现出以下症状:
- 套接字
sendto()
调用失败并出现错误 WSAENOBUFS (10055) - 此套接字上的后续
recvfrom()
调用未收到任何内容,即使 Wireshark 显示网络接口实际收到了预期的数据报。这种情况持续了大约 8 秒,之后 新 传入的数据报可以再次从套接字接收。 - 在 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.