Предотвращение TIME_WAIT с помощью .NET 'Async' API - PullRequest
2 голосов
/ 29 ноября 2010

У меня проблема, я разработал оболочку «Клиент и сервер» для личного использования, но, к сожалению, из-за недостаточных знаний в области сетевого программирования у меня возникают проблемы с TIME_WAIT при подключении к клиенту.Мой клиент пытается сделать несколько подключений к одному и тому же хосту в течение короткого периода времени, я обнаружил, что главная причина этого в том, что я пытаюсь повторно использовать сокет, и он переходит в состояние TIME_WAIT, потому что я закрываюсоединение без изящного отключения.Я хотел бы знать правильный шаблон для закрытия соединения с использованием сокетов .NET в случае, если я интенсивно использую API-интерфейсы Async, т.е. такие функции, как ConnectAsync, AcceptAsync, SendAsync, ReceiveAsync, DisconnectAsync (DisconnectAsync - повторно использует сокет)

Ответы [ 2 ]

6 голосов
/ 02 декабря 2010

Я обнаружил, что невозможно предотвратить TIME_WAIT.Любой сервер или клиент будут иметь проблему в любом случае, в зависимости только от того, кто инициирует закрытие соединения первым.Если клиент закрывает соединение, на сервере не будет TIME_WAIT.Если сервер закрывается первым, то на клиенте не будет TIME_WAIT.Таким образом, единственный вариант, который остается сделать, - это использовать SO_REUSEADDR, но в этом случае все еще невозможно использовать повторно используемый адрес для связи с ранее отключенным хостом

2 голосов
/ 29 ноября 2010

Вы можете использовать SO_REUSEADDR на сокете, чтобы обойти это.См. Socket.SetSocketOption для получения подробной информации, это опция ReuseAddress, которую вам нужно установить.

Кстати, вы действительно не имеете в виду повторное использование сокета, не так ли?как только вы получаете сообщение об ошибке, вы должны закрыть его и открыть новое.

...