У нас есть клиент-серверное приложение C ++, в котором клиент извлекает и отображает 3D-контент с сервера.
Наш клиент очень часто отключается от сервера (более 50% запусков выполняется менее чем за 1 минуту) с ошибкой recv
и возвращением WSAGetLastError
WSAECONNABORTED
.Но странно то, что это происходит только тогда, когда:
- клиент имеет графический процессор NVIDIA Quadro (это происходит на нескольких компьютерах с различными версиями Quadro)
- наше приложение использует OpenGL для рендеринга
Мы не видели этого на машине с другим графическим процессором.Переключение на Direct3D для рендеринга также устраняет разъединения.На одной машине Quadro это начало появляться (реже, но все же чаще, чем один раз в день) после того, как обновление драйвера прошло через обновление Windows.Помогла отмена драйвера.
Сервер также не работает в recv
с WSAECONNRESET
.Согласно этому ответу мы делаем что-то неправильно на стороне сервера, где мы действительно делаем shutdown
, а затем сразу close
.Но так как сервер получает WSAECONNRESET
, я бы сказал, что клиент сначала принудительно отключается, поэтому проблема не связана с тем, что сервер неправильно закрывает.
Вероятно, мы исправим сервер shutdown
+ close
проблема в долгосрочной перспективе, но мы хотели бы получить краткосрочный обходной путь или объяснение поведения на Quadros.Может быть, это ошибка драйвера, которая каким-то образом взаимодействует с Winsock, хотя это звучит очень странно.
Прав ли я, что сервер WSAECONNRESET
означает, что клиент отключился первым?
Любые идеи о том, как устранить потенциальные странные ошибки, которые драйвер GPU может вызвать для сокетов? Конечно, я не ожидаю конкретного решения нашей странной проблемы, но любая идея подойдет.