10

Я запускаю ссылку за пределами на xp, соединяясь с внешним узлом. Программа Link зависает примерно через 20 минут, и я не могу это исправить. Когда это происходит, используя tcpview, я вижу, что на хосте осталось около 200 tcp-соединений зомби, оставшихся от соединения Link. Я не могу очистить их, они из того же несуществующего процесса. Соединения зависают, пока я не перезагружаю хост. Перезагрузка - единственный способ восстановить соединение с сетевым соединением. Я думаю, что есть ошибка в outstv, которая вызывает это, но я не могу получить ответы на их форумах. Но в любом случае я хотел бы знать, есть ли способ уничтожить все эти соединения.

Изменить: на самом деле это около 3000 соединений WAIT_CLOSE накапливается примерно через 40 минут, и примерно тогда клиент умирает. Если я закрою приложение сервера, все эти сокеты теперь будут отображаться как принадлежащие процессу -non-existing- в tcpview. Понятный. Но разве нет способа закрыть их без перезагрузки?

7 ответов7

10

Вы можете использовать Currports от Nirsoft для мониторинга и уничтожения соединений.

Вы можете автоматизировать уничтожение шаблона соединения, используя AutoHotKey.

7

CLOSE_WAIT означает, что соединение было закрыто на другом конце.

Очевидно, что outstv не обнаруживает это условие и продолжает отправлять данные в приложение на другом конце. Другой конец не может отправить что-либо через это соединение, так как он закрыл свой конец соединения.

Решение состоит в том, чтобы установить запись TcpTimedWaitDelay в

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\tcpip\Parameters

Эта запись определяет время, которое должно пройти, прежде чем TCP сможет освободить закрытое соединение и повторно использовать свои ресурсы. Этот интервал между закрытием и освобождением известен как состояние TIME_WAIT или состояние 2MSL. В течение этого времени соединение может быть восстановлено с гораздо меньшими затратами для клиента и сервера, чем установление нового соединения.

По умолчанию на моем компьютере это значение равно -1, которое, как я понимаю, означает, что закрытые соединения никогда не освобождаются, и это именно то поведение, которое вы наблюдаете.

Я предлагаю вам установить значение этой записи в допустимом диапазоне 30–300 секунд. Я полагаю, что 300 секунд = 5 минут вполне достаточно для вашего случая, когда для остановки компьютера требуется 40 минут.

1

Возможно, вы сможете заставить Windows принудительно закрыть все TCP-соединения, 1) отключив, а затем 2) повторно включив сетевой интерфейс. Если это работает, вы можете выполнить пакетный сценарий для выполнения шагов, когда это необходимо.

Я искал способ сделать это через командную строку, из утилиты netsh (или аналогичной), но мне пока не повезло.

Конечно, лучший способ исправить это - исправить испорченное приложение. Убедитесь, что вы используете последнюю версию приложения; продолжайте глючить разработчиков; Если вы используете последнюю версию, попробуйте найти более старую версию программы.

1

Вы, вероятно, получаете эти сеансы CLOSE_WAIT из- за зависания программы - я не могу сказать, подозреваете ли вы их в качестве причины, поэтому просто хотел прояснить это.

Я предполагаю, что они не будут вечно торчать; вероятно, только на 2 часа и 5 секунд. Может показаться, навсегда, я знаю. Вы можете попробовать настроить KeepAliveTime (вероятно, требуется одна последняя перезагрузка) для вашего сетевого подключения до чего-то небольшого, например, 5 минут. Это может помочь им быстрее исчезнуть после зависания вашей программы.

Или, если вы знаете, что можете надежно запустить программу, скажем, 10 минут за раз, вы можете просто периодически перезапускать ее. Не знаю, является ли какое-либо из этих решений полезным для вашей конкретной ситуации; Я согласен с кря, что вы должны отказаться от проблемной версии приложения как можно скорее.

0

Попробуйте исправить WinSock XP.

http://www.snapfiles.com/get/winsockxpfix.html

Он удаляет ваше соединение и сбрасывает его обратно по умолчанию. Я всегда держу это на флешке, когда все остальное терпит неудачу.

0

Возможно ли проблема с брандмауэром? Это может быть неполное соединение, которое проверяется и повторяется.

Я бы отключил все брандмауэры на обеих машинах, а если есть маршрутизатор, то и его внутренний брандмауэр.

0

Посмотрите, не выходит ли за пределы экрана другой процесс, который удерживает соединения открытыми. Process Explorer покажет вам, если это происходит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .