Как корректно сделать "un-bind" ?

Модератор: Модераторы разделов

apprentice
Сообщения: 595
ОС: Debian 6

Как корректно сделать "un-bind" ?

Сообщение apprentice »


слушаю порт, все работает, но после выхода из программы ее не удается сразу перезапустить, bind сообщает что порт занят (приходится ждать около минуты пока порт освободится). При выходе я закрываю сокет, но этого видимо недостаточно что еще нужно сделать что бы освободить порт?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Как корректно сделать "un-bind" ?

Сообщение /dev/random »

После закрытия сокета он не уничтожается до тех пор, пока система не решит, что на него больше не придёт ни один "затерявшийся" пакет (это состояние называется TIME_WAIT). Чтобы переоткрыть сокет несмотря на то, что он ещё не уничтожен, используйте опцию SO_REUSEADDR.
Спасибо сказали:
apprentice
Сообщения: 595
ОС: Debian 6

Re: Как корректно сделать "un-bind" ?

Сообщение apprentice »

/dev/random писал(а):
30.07.2010 19:57
После закрытия сокета он не уничтожается до тех пор, пока система не решит, что на него больше не придёт ни один "затерявшийся" пакет


Значит такое поведение - норма?
В принципе, меня это не напрягает, главное что бы это не приводило к утечкам ресурсов.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Как корректно сделать "un-bind" ?

Сообщение /dev/random »

apprentice писал(а):
30.07.2010 20:26
Значит такое поведение - норма?

Да, норма. Но в большинстве серверных приложений, чтобы их можно было спокойно перезапускать, сокеты создаются с опцией SO_REUSEADDR, которая позволяет биндить сокет на тот же порт, не дожидаясь, когда же он уничтожится..

apprentice писал(а):
30.07.2010 20:26
В принципе, меня это не напрягает, главное что бы это не приводило к утечкам ресурсов.

Не приведёт.
Спасибо сказали:
vel21ripn
Сообщения: 14

Re: Как корректно сделать "un-bind" ?

Сообщение vel21ripn »

/dev/random писал(а):
30.07.2010 20:31
apprentice писал(а):
30.07.2010 20:26
Значит такое поведение - норма?


ну не совсем.
Да, норма. Но в большинстве серверных приложений, чтобы их можно было спокойно перезапускать, сокеты создаются с опцией SO_REUSEADDR, которая позволяет биндить сокет на тот же порт, не дожидаясь, когда же он уничтожится..

apprentice писал(а):
30.07.2010 20:26
В принципе, меня это не напрягает, главное что бы это не приводило к утечкам ресурсов.

Не приведёт.

при быстрых открытия/закрытиях можно все порты сьесть на некоторое время....
Чтоб соединение корректно закрылось (и порт освобождался максимально быстро) перед закрытием сокета нужно не забывать делать shutdown(,SHUT_RDWR), ну и setsockopt(,SO_LINGER,...) перед этим настроить.

А используя SO_REUSEADDR главное не допустить запуска нескольких одинаковых процессов.
Спасибо сказали: