Функция winsock recv может возвращать ошибку (SOCKET_ERROR), а затем, даже если следующий вызов WSAGetLastError следующий, она все равно может возвращать 0 как код ошибки.
Впервые я обнаружил эту «ошибку»,переключение из режима отладки в режим выпуска.Мой код работал нормально при отладке, но отключал клиентов в режиме выпуска.
Причина этого в том, что буфер приема был недостаточно велик.Но это нигде не задокументировано.В моем случае режим релиза сделал все достаточно быстро, чтобы переполнить буфер.
Простое увеличение размера буфера решит проблему (3-й параметр в recv.
Надеюсь, что это поможет. Удачи