Как я могу принудительно закрыть TcpListener - PullRequest
4 голосов
/ 07 июня 2010

У меня есть сервис, который общается через tcpListener.Проблема в том, что когда пользователь перезапускает службу, возникает исключение «Адрес уже используется», и служба не может быть запущена в течение пары минут или около того.старое соединение, чтобы я мог открыть новое?(Я не могу просто использовать случайные порты, потому что служба не может уведомить клиентов о том, что это за порт, поэтому мы должны зависеть от предварительно определенного порта)

Ответы [ 2 ]

4 голосов
/ 07 июня 2010

Установите параметр сокета SO_REUSEADDR перед привязкой к порту прослушивания. Похоже, соответствующий код .NET выглядит примерно так:

SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
1 голос
/ 22 ноября 2010

Существует причина, по которой сокеты не используются в течение некоторого времени после их закрытия. Сокет состоит из 4-х кортежей, Source и Dest Port, Source и Dest IP.

Допустим, вы принудительно закрыли сокет, когда клиент был занят отправкой данных на сервер. Вы ждете 5 секунд и снова открываете сервер с тем же портом, и тот же клиент отправляет данные в один и тот же кортеж 4, сервер получит пакеты с неправильными порядковыми номерами tcp, и соединения получат сброс.

Вы стреляете себе в ногу:)

Вот почему соединения имеют статус time_wait в течение 2-4 минут (в зависимости от дистрибутива), пока они не могут быть снова использованы. Просто чтобы прояснить, я говорю о розетках, а не только о прослушивании порта TCP.

...