10038 ошибка сокета - PullRequest
       4

10038 ошибка сокета

4 голосов
/ 16 октября 2010

Есть ли какое-либо решение для ошибки сервера 10038. Я сделал кодирование в C ++; сервер работает нормально от 10 до 12 часов, но внезапно выдает ошибку 10038 сокета

Ответы [ 4 ]

11 голосов
/ 16 октября 2010

Не видя ваш код: описываемый вами симптом звучит так, как будто вы теряете память / ресурсы, то есть вы забываете освободить / удалить выделенные вами объекты.Это также может быть проблемой времени.Я предлагаю вам опубликовать свой (урезанный) код.

10038 (WSAENOTSOCK): Операция с сокетом для nonsocket. Была предпринята попытка выполнить операцию с чем-то, кроме сокетаЛибо параметр дескриптора сокета не ссылается на действительный сокет, либо для select элемент fd_set недействителен.

7 голосов
/ 16 октября 2010

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

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

6 голосов
/ 16 октября 2010

Причин может быть две:

  1. Ваш дескриптор сокета неинициализирован (т.е. не ссылается на действительный сокет).
  2. Вы закрыли этот сокет (путем вызова closesocket) и все еще пытаетесь его использовать.

Такая ошибка всегда ошибка , она не связана с реальной сетевой активностью / состоянием и т. Д. Это эквивалентно (в некотором смысле) любой попытке использовать ресурс / память после освобождения это или просто ссылка на неинициализированный указатель.

Так, чтобы решить 10038, вы должны исправить свой код.

P.S. Если у вас есть многопоточное приложение - скорее всего, вы закроете сокет в одном потоке, тогда как другой поток все еще пытается его использовать.

В любом случае, хорошей практикой является инициализация дескрипторов сокетов на INVALID_SOCKET в начале. Также установите его на INVALID_SOCKET сразу после закрытия.

Затем, прежде чем пытаться использовать его, вы можете проверить, действителен ли сокет. Таким образом, вы можете найти проблемный сценарий.

0 голосов
/ 09 ноября 2017

Также обратите внимание на тот факт, что - по крайней мере в Windows - вы получите 10038, если попытаетесь отправить сокет в одном потоке, который был открыт в другом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...