2012-04-05 2 views
3

Этот вызов должен возвращаться только через очень короткое время, но на некоторых машинах он необъяснимо занимает очень близкое расстояние до 1 секунды. Кто-нибудь видел эту проблему. Я использую loopback-адрес, поэтому сеть должна быть вне картинки.Вызов WinSock closeesocket() занимает несколько секунд на некоторых компьютерах

+1

Возможно, программное обеспечение антивирусного программного обеспечения вмешивается? –

+0

Не очень полезное антивирусное/брандмауэр-программное обеспечение, если оно просто добавляет задержку. У меня отключен мой брандмауэр, и для проверки на вирусы не работает резидентный экран. Такое же поведение. –

+0

Некоторые аудиовизуальные средства и продукты безопасности имеют тенденцию вводить поведение с ошибкой. Если вы в противном случае застряли, возможно, стоит удалить их все - в то время как в сети, конечно! - для двойной проверки. –

ответ

0

Проблема, вероятно, где-то внутри реализации сокетов. С точки зрения ОС вызов closesocket (или CloseHandle) эквивалентен выпуску «устройства» для драйвера. В основном драйверы обрабатывают этот запрос немедленно (синхронно), прерывая все (потенциальные) выдающиеся операции ввода-вывода, если необходимо. Однако «глупые» драйверы могут заблокировать вас до что-то завершено.

Вот что я хотел бы сделать:

  • Try прекратить свою программу (на диспетчер задач). Требуется ли время для его прекращения? (если так - кажется, что он заблокирован водителем).
  • Если вы говорите о потоковом сокете (т. Е. TCP или аналогичном) - попробуйте использовать параметр SO_DONTLINGER. То есть укажите, что вы не хотите ждать, пока все ожидающие данные будут отправлены одноранговому узлу.
+0

Немного сложно сказать, требуется ли 1 секунда для завершения процесса с помощью диспетчера задач, так как есть другие задержки. SO_DONTLINGER не должен иметь никакого эффекта в данном конкретном случае, поскольку данные не передаются через сокет, он просто устанавливается и затем закрывается. SO_DONTLINGER ожидает, пока все данные будут отправлены. –

+0

@ Jesse Pepper: Помимо отправки неотправленных данных, в TCP есть «церемония» закрытия соединения изящно, в которое входит некоторый пинг-понг с пакетами «FIN». Я не уверен, но, возможно, «SO_DONTLINGER» включает и это. То есть с этим флагом он прерывает соединение с 'RST' – valdo

Смежные вопросы