Почему сокеты сразу не убиваются, а еще нек. время живут?
От: Grizzli  
Дата: 19.02.03 21:44
Оценка:
и на клиенте, и на сервере говорю сокету сначала shotdown, потом closesocket. если попытаться законектиться по тому же порту снова тут же — не получается, говорит что порт занят. если использовать опцию SO_REUSEADDR все ок, но если посмотреть netstat'om то там гора сокетов с статусом TIME_WAIT. Итак, вопрос. как мне сделать так, что бы после моих close'ев сокет 100% убивался. а не висел некоторое время в состояние ожидания(вопрос отдельный — а что он там ждет то!)
Re: Почему сокеты сразу не убиваются, а еще нек. время живут
От: kiamor  
Дата: 20.02.03 06:02
Оценка:
Здравствуйте, Grizzli, Вы писали:

G>...а что он там ждет то!


Есть у сокетов параметры. Слыхал? Среди них есть такой:
"таймаут при уничтожении сокета" (ну может не совсем точное название...)
Только набор параметров разными реализациями и ОС поддерживается по-разному.
Где-то есть, где-то нет...
Re: Почему сокеты сразу не убиваются, а еще нек. время живут
От: NavuhodonosoR Россия  
Дата: 20.02.03 06:32
Оценка:
Здравствуйте, Grizzli, Вы писали:

G>и на клиенте, и на сервере говорю сокету сначала shotdown, потом closesocket. если попытаться законектиться по тому же порту снова тут же — не получается, говорит что порт занят. если использовать опцию SO_REUSEADDR все ок, но если посмотреть netstat'om то там гора сокетов с статусом TIME_WAIT. ...


Про состояние TIME_WAIT читать например у Йон Снейдер "Эффективное программирование TCP/IP". Или посмотреть здесь.
Re: Почему сокеты сразу не убиваются, а еще нек. время живут
От: McQwerty Россия  
Дата: 20.02.03 08:32
Оценка:
Здравствуйте, 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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.