Как расследовать случаи, когда WSAECONNABORTED на стороне клиента происходит очень часто только на машинах с NVIDIA Quadro? - PullRequest
4 голосов
/ 30 июля 2010

У нас есть клиент-серверное приложение 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 может вызвать для сокетов? Конечно, я не ожидаю конкретного решения нашей странной проблемы, но любая идея подойдет.

1 Ответ

1 голос
/ 10 апреля 2012

Возможно ли, что клиент выполняет закрытие / завершение работы с непрочитанными данными, которые все еще находятся в приемном буфере?Это прервет соединение.

...