Как корректно сделать "un-bind" ?
Модератор: Модераторы разделов
-
apprentice
- Сообщения: 595
- ОС: Debian 6
Как корректно сделать "un-bind" ?
слушаю порт, все работает, но после выхода из программы ее не удается сразу перезапустить, bind сообщает что порт занят (приходится ждать около минуты пока порт освободится). При выходе я закрываю сокет, но этого видимо недостаточно что еще нужно сделать что бы освободить порт?
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
Re: Как корректно сделать "un-bind" ?
После закрытия сокета он не уничтожается до тех пор, пока система не решит, что на него больше не придёт ни один "затерявшийся" пакет (это состояние называется TIME_WAIT). Чтобы переоткрыть сокет несмотря на то, что он ещё не уничтожен, используйте опцию SO_REUSEADDR.
-
apprentice
- Сообщения: 595
- ОС: Debian 6
Re: Как корректно сделать "un-bind" ?
/dev/random писал(а): ↑30.07.2010 19:57После закрытия сокета он не уничтожается до тех пор, пока система не решит, что на него больше не придёт ни один "затерявшийся" пакет
Значит такое поведение - норма?
В принципе, меня это не напрягает, главное что бы это не приводило к утечкам ресурсов.
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
Re: Как корректно сделать "un-bind" ?
Да, норма. Но в большинстве серверных приложений, чтобы их можно было спокойно перезапускать, сокеты создаются с опцией SO_REUSEADDR, которая позволяет биндить сокет на тот же порт, не дожидаясь, когда же он уничтожится..
apprentice писал(а): ↑30.07.2010 20:26В принципе, меня это не напрягает, главное что бы это не приводило к утечкам ресурсов.
Не приведёт.
-
vel21ripn
- Сообщения: 14
Re: Как корректно сделать "un-bind" ?
ну не совсем.
Да, норма. Но в большинстве серверных приложений, чтобы их можно было спокойно перезапускать, сокеты создаются с опцией SO_REUSEADDR, которая позволяет биндить сокет на тот же порт, не дожидаясь, когда же он уничтожится..
apprentice писал(а): ↑30.07.2010 20:26В принципе, меня это не напрягает, главное что бы это не приводило к утечкам ресурсов.
Не приведёт.
при быстрых открытия/закрытиях можно все порты сьесть на некоторое время....
Чтоб соединение корректно закрылось (и порт освобождался максимально быстро) перед закрытием сокета нужно не забывать делать shutdown(,SHUT_RDWR), ну и setsockopt(,SO_LINGER,...) перед этим настроить.
А используя SO_REUSEADDR главное не допустить запуска нескольких одинаковых процессов.