Бьюсь об заклад, вы получаете доступ к сокету, который вы уже закрыли. Это очень распространенная ошибка синхронизации в программировании WinSock - хорошие новости (и плохие, потому что их трудно воспроизвести) состоят в том, что вы не делаете это очень часто, поэтому, скорее всего, вашему коду не нужно много работать, чтобы сделать его идеальным. Я думаю, что вы должны добавить поточно-ориентированную диагностику, которая выводит строку, включающую значение сокета (в основном int
), при каждом открытии и закрытии, и везде, где вы видите эти 10038 или другие неожиданные ошибки.
Если вы можете добавить эту диагностику и затем настроить стресс-тест, который фокусируется на открытых и закрытых областях в вашей программе (вам может понадобиться сократить код до небольшого подмножества для модульного тестирования обработки сокетов, возможно, сделав это Взаимодействие на локальном хосте или на двух компьютерах, подключенных к локальной сети), тогда, скорее всего, оно проявится гораздо быстрее, чем через 10-12 часов, и вы можете найти и исправить другие временные окна по пути. Цель состоит в том, чтобы попытаться сжать 10–12 часов «нормальной» активности сокетов в как можно меньшее время, чтобы действительно выявить любые трудно обнаруживаемые проблемы параллелизма.