и на клиенте, и на сервере говорю сокету сначала shotdown, потом closesocket. если попытаться законектиться по тому же порту снова тут же — не получается, говорит что порт занят. если использовать опцию SO_REUSEADDR все ок, но если посмотреть netstat'om то там гора сокетов с статусом TIME_WAIT. Итак, вопрос. как мне сделать так, что бы после моих close'ев сокет 100% убивался. а не висел некоторое время в состояние ожидания(вопрос отдельный — а что он там ждет то!)
Здравствуйте, Grizzli, Вы писали:
G>и на клиенте, и на сервере говорю сокету сначала shotdown, потом closesocket. если попытаться законектиться по тому же порту снова тут же — не получается, говорит что порт занят. если использовать опцию SO_REUSEADDR все ок, но если посмотреть netstat'om то там гора сокетов с статусом TIME_WAIT. ...
Про состояние TIME_WAIT читать например у Йон Снейдер "Эффективное программирование TCP/IP". Или посмотреть
здесь.
Здравствуйте, Grizzli, Вы писали:
G>и на клиенте, и на сервере говорю сокету сначала shotdown, потом closesocket. если попытаться законектиться по тому же порту снова тут же — не получается, говорит что порт занят. если использовать опцию SO_REUSEADDR все ок, но если посмотреть netstat'om то там гора сокетов с статусом TIME_WAIT. Итак, вопрос. как мне сделать так, что бы после моих close'ев сокет 100% убивался. а не висел некоторое время в состояние ожидания(вопрос отдельный — а что он там ждет то!)
Это связано с желанение не пропустить последний FIN с другой стороны.
Для гарантированного быстрого убивания сокета я использую следующий код:
shutdown (hSocket, 2);
LINGER linger = { 1, 0 };
setsockopt (hSocket, SOL_SOCKET, SO_LINGER, (char*) & linger, sizeof (linger));
closesocket (hSocket);