我们有一个 C++ 客户端/服务器应用程序,其中客户端从服务器检索和呈现 3D 内容。
我们的客户端经常与服务器断开连接(不到 1 分钟后超过 50% 的运行)recv
失败并WSAGetLastError
返回WSAECONNABORTED
。但奇怪的是,这仅在以下情况下才会发生:
- 客户端有一个 NVIDIA Quadro GPU(发生在具有不同版本 Quadro 的多台机器上)
- 我们的应用程序使用 OpenGL 进行渲染
我们没有在具有另一个 GPU 的机器上看到这一点。切换到 Direct3D 进行渲染也会使断开连接消失。在通过 Windows 更新推送驱动程序更新后,在一台 Quadro 机器上,这种情况开始出现(不太常见,但每天仍不止一次)。恢复驱动程序有帮助。
服务器也失败recv
了WSAECONNRESET
。根据这个答案,我们在服务器端做错了,我们确实做错了shutdown
,然后立即close
。但是由于服务器得到了WSAECONNRESET
我会说客户端首先强制断开连接,所以问题不是由服务器执行错误关闭引发的。
从长远来看,我们可能会修复服务器shutdown
+close
问题,但我们需要一些短期解决方法或解释 Quadros 上的行为。也许这是一个驱动程序错误,它以某种方式与 Winsock 交互,即使它听起来很古怪。
我是对的,服务器WSAECONNRESET
意味着客户端首先断开连接吗?
关于如何解决 GPU 驱动程序可能导致套接字的潜在奇怪错误的任何想法?当然,我不希望为我们奇怪的问题提供具体的解决方案,但任何想法都可以。