Фон:
У меня есть код, который подключается к серверу для сбора данных. Однако в какой-то момент программа попала в состояние, когда он не смог подключиться к серверу. Проблема, которую мы наблюдаем, заключается в том, что сервер постоянно выходил из строя, когда мы пытались снова подключиться.Закрыть все сетевые подключения
Plugin:
У нас есть тайм-аут установлены значения по умолчанию, используемые нашей сети плагин (расчетливости плагин). Эти значения представляют собой тайм-аут 100 кбит/с и 300 кбит/с. Не совсем короткие таймауты. Кроме того, каждый раз, когда мы пытаемся повторно подключиться, мы воссоздаем класс плагина, поэтому любые значения, которые он устанавливает внутренне, сбрасываются каждый раз, когда мы пытаемся повторно подключиться. Я считаю, что тайм-ауты не являются проблемой. И я считаю, что плагин не проблема.
Сеть:
Мы видели, что эти повторяющиеся таймауты происходят в течение получаса. Когда мы перезапустили службу (а не машину), она сразу же вернулась в сеть. Итак, я знаю, что это не проблема сети. Это заставляет меня поверить, что в нашем коде есть что-то, что попадает в недопустимое состояние сети. Кроме того, это состояние, которое мы не можем контролировать, поскольку наш плагин скрывает от нас все хорошие сетевые материалы, включая таймауты, флаги keepalive и группы соединений (среди прочих). В основном у нас нет доступа к члену HTTPWebReqest.
Вопрос:
Когда наши настройки сети попадают в это состояние, мы пытаемся закрыть все соединения и повторного подключения к серверу. Цель состояла в том, чтобы убить все активные соединения, чтобы сбросить все состояние, в которое мы попали. Однако, когда мы пытаемся снова подключиться, мы получаем тайм-ауты на нашем повторном подключении.
Как-то (вероятно, из-за KeepAlive и TCP Конвейеризация, которые мы не можем контролировать), сетевые соединения остаются открытыми, даже если мы закрыли все соединения. Это оставляет нас в плохом состоянии и не позволяет нам подключаться к серверу.
Вопрос:
Как я могу убить все лежащее в основе подключение к серверу для того, чтобы вынудить переподключение?
Лично я бы рекомендовал изменить библиотеку, которую вы используете. Однако, поскольку я - вы, я знаю, что это не вариант. – Richard
+1. Хороший комментарий и ответ – Danexxtone