Как правильно закрывать сокеты
От: SergeyAksuchenko Беларусь  
Дата: 01.06.03 23:53
Оценка:
Как правильно закрыть потоковый сокет,
что бы он после этого не висел некоторое
время в состоянии TIME_WAIT?

netstat -a -n
Re: Как правильно закрывать сокеты
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.06.03 23:58
Оценка:
Здравствуйте, SergeyAksuchenko, Вы писали:

Что та такое? http://www.rsdn.ru/Forum/?mid=77004
Автор: Flamer
Дата: 26.07.02
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Как правильно закрывать сокеты
От: SergeyAksuchenko Беларусь  
Дата: 02.06.03 00:05
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, SergeyAksuchenko, Вы писали:


A>Что та такое? http://www.rsdn.ru/Forum/?mid=77004
Автор: Flamer
Дата: 26.07.02


Совсем не то, я же спрашиваю как закрывать сокет.
Re[3]: Как правильно закрывать сокеты
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.06.03 00:07
Оценка:
Здравствуйте, SergeyAksuchenko, Вы писали:

SA>Совсем не то, я же спрашиваю как закрывать сокет.

Нет, я про использование ioctlsocket
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Как правильно закрывать сокеты
От: sercher Украина  
Дата: 02.06.03 06:00
Оценка:
shutdown()
closesocket()
Re: Как правильно закрывать сокеты
От: Аноним  
Дата: 02.06.03 07:32
Оценка:
Здравствуйте, SergeyAksuchenko, Вы писали:

SA>Как правильно закрыть потоковый сокет,

SA>что бы он после этого не висел некоторое
SA>время в состоянии TIME_WAIT?

А зачем это надо?
Дело в том, что после закрытия сокета, он продолжает какое-то время жить в системе, чтобы корректно добить пакеты, которые могли задержаться в сети, и, возможно, чтобы не использовать для вновь открываемых сокетов те же параметры, которые недавно были использованы (опять же, чтобы в них не сыпался мусор, который остался от предыдущего соединения; чтобы их не попутали, когда один конец думаеет, что соединение закрыто, а второй так не думает).

При этом сокет переходит в какое-то специфическое состояние, наверное это и есть TIME_WAIT.
Re: Как правильно закрывать сокеты
От: Sashko Россия http://www.dc.baika.ru/
Дата: 02.06.03 07:38
Оценка:
> Как правильно закрыть потоковый сокет,
> что бы он после этого не висел некоторое
> время в состоянии TIME_WAIT?

Это и есть правильное закрытие. http://www.rsdn.ru/Forum/?mid=128392
Автор: Sashko
Дата: 11.11.02

В TIME_WAIT некоторое время будет находиться тот, кто инициировал закрытие
сокетного соединения. Если ты хочешь обойти EADDRINUSE то посмотри
SO_REUSEADDR
Posted via RSDN NNTP Server 1.5
Re: Как правильно закрывать сокеты
От: av Россия  
Дата: 08.06.03 19:29
Оценка: 24 (1)
SA>Как правильно закрыть потоковый сокет,
SA>что бы он после этого не висел некоторое
SA>время в состоянии TIME_WAIT?

В моём понимании, в состоянии TIME_WAIT находится сокет, закрытый с одной стороны, но не закрытый с другой. Для обхода ситуации непосредственно перед close(fd) [в виндах — closesocket(fd)] вызови shutdown(fd,SHUT_RDWR) [в виндах — shutdown(fd,SD_BOTH)] — это сигнал удаленной машине, что данные больше пересылаться и приниматься вызвавшей shutdown() стороной не будут. Как следствие, select() на удаленной машине сработает, recv() вернет ноль и удаленная машина (если она правильно работает, конечно) закроет соединение —
после этого сокет из TIME_WAIT изчезнет.
Re[2]: Как правильно закрывать сокеты
От: SergeyAksuchenko Беларусь  
Дата: 08.06.03 22:21
Оценка:
> В моём понимании, в состоянии TIME_WAIT находится сокет,
> закрытый с одной стороны, но не закрытый с другой.
> Для обхода ситуации непосредственно перед close(fd) [в виндах — closesocket(fd)]
> вызови shutdown(fd,SHUT_RDWR) [в виндах — shutdown(fd,SD_BOTH)] — это сигнал
> удаленной машине, что данные больше пересылаться и приниматься вызвавшей
> shutdown() стороной не будут. Как следствие, select() на удаленной машине
> сработает, recv() вернет ноль и удаленная машина (если она правильно работает,
> конечно) закроет соединение -
> после этого сокет из TIME_WAIT изчезнет.

Именно так и делаю, но не помогает
Поэтому и спросил.
Posted via RSDN NNTP Server 1.6 beta
Re[2]: Как правильно закрывать сокеты
От: Sashko Россия http://www.dc.baika.ru/
Дата: 09.06.03 02:10
Оценка:
Здравствуйте, av, Вы писали:

av>В моём понимании, в состоянии TIME_WAIT находится сокет, закрытый с одной стороны, но не закрытый с другой.


RFC 793
http://www.rsdn.ru/Forum/?mid=128392
Автор: Sashko
Дата: 11.11.02


Сокет закрытый локально (сказав ему closesocket или shutdown(SD_SEND), тем самым отослав FIN на другую сторону), но не получивший FIN с другой стороны находится в FIN_WAIT_n (FIN_WAIT_1 если еще не получил ACK на совой FIN и в FIN_WAIT_2 в противном случае).

Если сокет был закрыт удалено, но локально еще не закрыт, то он будет находиться в состоянии CLOSE_WAIT.

В RFC 793 объясняется, для чего, после закрытия, одна из сторон остается в TIME_WAIT 2MSL (Maximum Segment Lifetime).
Re[2]: Как правильно закрывать сокеты
От: msn  
Дата: 09.06.03 09:46
Оценка:
Здравствуйте, av, Вы писали:

SA>>Как правильно закрыть потоковый сокет,

SA>>что бы он после этого не висел некоторое
SA>>время в состоянии TIME_WAIT?

В состояние TIME_WAIT попадает тот сокет который первым инициировал разрыв соединения,
после того, как принял подтверждение на отосланный сегмент FIN, получил FIN от собеседника
и послал ему подтверждение.
и как уже говорилось выше, это состояние используется для того, чтобы дождаться истечения времени жизни дублированных пакетов и обеспечить надежность разрыва соединения.
Насколько я знаю, даже изменить время состояния TIME_WAIT нельзя это зависит от реализации, обычно от 30 сек, до 2х минут.
Ни close ни shutdown ничего не меняют.
Re: Как правильно закрывать сокеты
От: clairbee Россия http://clairbee.void.ru/
Дата: 10.06.03 02:27
Оценка:
Здравствуйте, SergeyAksuchenko, Вы писали:

SA>Как правильно закрыть потоковый сокет,

SA>что бы он после этого не висел некоторое
SA>время в состоянии TIME_WAIT?

SA>netstat -a -n


Сказать peer'у, чтобы он закрыл.
А если закрываешь сам, то нет шансов.
Все-таки по стандарту TCP инициатор закрытия должен подержать у себя TIME_WAIT некоторое время.
Другой дело, что можно через sysctl уменьшить это самое время.
Скажи какая ОС, скажу каким sysctl'ем.
--
Роман И. Кузьменко (http://clairbee.void.ru/) (mailto:kuz@pisem.net)
Re[2]: Как правильно закрывать сокеты
От: av Россия  
Дата: 10.06.03 19:59
Оценка:
c> Скажи какая ОС, скажу каким sysctl'ем.

FreeBSD-4.3
Posted via RSDN NNTP Server 1.6 beta
Re[3]: Как правильно закрывать сокеты
От: clairbee Россия http://clairbee.void.ru/
Дата: 11.06.03 00:06
Оценка:
Здравствуйте, av, Вы писали:

c>> Скажи какая ОС, скажу каким sysctl'ем.

av>FreeBSD-4.3

sysctl -w net.inet.tcp.msl=<number>

где <number> меньше текущего значения...
уменьшай до тех пор, пока не надоест...
в принципе, это переменная имеет глобальное значение на поведение стэка, так что в контексте инета не советую уменьшать ее больше чем в 10 раз.
Хотя если ты работаешь не с dial up internet clients, а с какими-нибудь приложениями в локальной сети, то хоть до 30 уменьшай.
--
Роман И. Кузьменко (http://clairbee.void.ru/) (mailto:kuz@pisem.net)
Re[4]: Как правильно закрывать сокеты
От: av Россия  
Дата: 11.06.03 01:14
Оценка:
с> sysctl -w net.inet.tcp.msl=<number>

Thnx a lot!
Скажи вот что, плиз: это вещь постоянная или ее при каждой загрузке ставить
надо?
Posted via RSDN NNTP Server 1.6 beta
Re[5]: Как правильно закрывать сокеты
От: clairbee Россия http://clairbee.void.ru/
Дата: 11.06.03 02:02
Оценка:
Здравствуйте, av, Вы писали:

с>> sysctl -w net.inet.tcp.msl=<number>


av>Thnx a lot!

av>Скажи вот что, плиз: это вещь постоянная или ее при каждой загрузке ставить
av>надо?

При каждой загрузке.
See also: /etc/loader.conf
--
Роман И. Кузьменко (http://clairbee.void.ru/) (mailto:kuz@pisem.net)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.