Имам проблем, разработих обвивка на клиент и сървър за моя лична употреба, но за съжаление поради недостатъчни познания в мрежовото програмиране, имам проблеми с TIME_WAIT по време на свързване на клиента. Моят клиент се опитва да направи множество връзки към един и същ хост в рамките на кратък период от време, разбрах, че основната причина за това е, че се опитвам да използвам повторно сокета и той преминава в състояние TIME_WAIT, защото затварям връзка без грациозно изключване. Бих искал да знам правилния модел за затваряне на връзка с помощта на .NET сокети, в случай че използвам интензивно „Async“ API, т.е. функции като ConnectAsync, AcceptAsync, SendAsync, ReceiveAsync, DisconnectAsync (DisconnectAsync - използва повторно сокет)
Предотвратяване на TIME_WAIT с помощта на .NET 'Async' API
Отговори (2)
Можете да използвате SO_REUSEADDR на сокета, за да заобиколите това. Вижте Socket.SetSocketOption за подробности, това е опцията ReuseAddress
, която трябва да зададете .
Между другото, нямате предвид наистина да използвате повторно гнездото, нали? след като получите грешка, трябва да го затворите и да отворите нов.
Открих, че е невъзможно да предотвратя TIME_WAIT. Сървърът или клиентът ще имат проблема по всякакъв начин, в зависимост само от това кой първи инициира затваряне на връзката. Ако клиентът затваря връзката, няма да има TIME_WAIT на сървъра. Ако сървърът се затваря първи, тогава няма да има TIME_WAIT на клиента. Така че единствената опция, която остава да направите, е да използвате SO_REUSEADDR, но в този случай това все още е невъзможно да се използва повторно използвания адрес за свързване с предварително прекъснат хост