Принудительно закрыть TCP-соединение, застрявшее в состоянии CLOSE-WAIT - PullRequest
1 голос
/ 01 апреля 2019

Мое приложение запрашивает видеопоток m3u8 (HLS) через внешний плагин через локальный хост (например, 192.168.0.108:port/foobar.ts).На этом локальном хосте у меня есть прослушивание HttpListener, которое ловит этот файл и проверяет его.И отправляет команду загрузки для этого файла на сервер.пока файл загружается, он возвращается обратно к плагину с помощью HttpListenerContext.Response.OutputStream().если интернет-соединение достаточно быстрое, оно также предварительно загрузит предстоящие фрагменты, если они доступны.

Это работает нормально, пока весь фрагмент .ts загружен.Однако, когда пользователь решает переключить видео, когда он находится в процессе отправки данных через HttpListenerContext.Response.OutputStream(), это вызывает исключение сокета System.IO.IOException: Unable to write data to the transport connection: The socket has been shut down. ---> System.Net.Sockets.SocketException: The socket has been shut down.

Всякий раз, когда это происходит, соединение-призрак, кажется, остается открытымна заднем плане, который находится в состоянии CLOSE-WAIT.это имеет 1 байт в rx_queue в соответствии с /proc/net/tcp enter image description here Это соединение не истекает, пока приложение живо, и я, кажется, не могу закрыть его, пока я не уничтожу весь HttpListener.

Простое удаление InputStream и OutputStream и установка контекста на null также не закрывает соединение

currentContext.Response.OutputStream.Dispose();
currentContext.Request.InputStream.Dispose();
currentContext = null;

Есть ли способ принудительно закрыть это соединение?

...