Вызов WinSock closesocket() на некоторых компьютерах занимает одну секунду
Этот вызов должен вернуться через очень короткое время, но на некоторых машинах он необъяснимо занимает очень близко к 1 секунде. Кто-нибудь видел эту проблему. Я использую адрес обратной связи, поэтому сеть должна быть вне поля зрения.
1 ответ
Проблема, вероятно, где-то внутри реализации оконных сокетов. С точки зрения ОС вызов closesocket
(или же CloseHandle
) эквивалентно освобождению объекта "устройство" водителя. В основном драйверы обрабатывают этот запрос немедленно (синхронно), прерывая все (потенциальные) ожидающие операции ввода-вывода, если это необходимо. Однако "глупые" водители могут блокировать вас, пока что-то не будет завершено.
Вот что я бы сделал:
- Попробуйте завершить свою программу (с помощью диспетчера задач). Требуется ли время, чтобы прекратить это? (если так - кажется, это заблокировано водителем).
- Если вы говорите о потоковом сокете (то есть TCP или подобном) - попробуйте использовать
SO_DONTLINGER
вариант. То есть укажите, что вы не хотите ждать, пока все ожидающие данные будут отправлены одноранговому узлу.