bind: Address already in use

Автор mihail_1, 17 сентября 2013, 11:19:27

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

mihail_1

Создаю сокет. Назначаю ему конкретный ip и любой порт. Открываю исходящее соединение, посылаю запрос, получаю ответ, закрываю соединение. И так много много раз во многих потоках. Но вдруг через несколько часов работы получаю:
bind: Address already in use
Как так может быть и как починить?

vladimir_ar

Очевидно, что его уже кто-то использует. Смотреть - кто. Или Вы сами в какой-то момент по какой-либо причине его не закрыли.
Debian Testing, kernel 3.16-2-amd64, OpenBox
AMD A8-3750 / 16Gb RAM / ATI HD6550D (onboard) / Sound ASUS Xonar - DS
_______________________________
Debian Testing, kernel 3.14-2-amd64, OpenBox
HP-655 AMD E1 / 8Gb RAM / ATI HD7310M

mihail_1

Использует кого?
IP? Все нити используют один и тот же IP и несколько часов это не мешает.
Порт? Должен автоматически назначаться свободный. Каждый поток одновременно открывает одно соединение, как может быть выделен занятый порт, когда полно свободных?

qupl

Цитата: mihail_1 от 17 сентября 2013, 15:41:04Порт? Должен автоматически назначаться свободный.
Кто кому должен? Какой порт Вы укажете тот и попытается использовать ваша программа. Откуда возьмется "автоматика"?

mihail_1

Ну наверное функция bind, своей документации. И делает она это вполне неплохо (как минимум первые несколько часов).
Автоматика вероятно берется где-то в системном вызове, который запросит функция bind, если в качестве номера порта задать 0.

qupl

Цитата: mihail_1 от 17 сентября 2013, 17:41:21И делает она это вполне неплохо (как минимум первые несколько часов).
Пока не закончатся порты из свободного диапазона 1024-5000.

Запустите netstat во вторые полчаса работы.

mihail_1

#6
На вторые полчаса я опаздал (прошло уже больше 4 часов):
имею примерно 1500 тысячи соединений с портов приверно с 31000 по 61000 в статусах в основном TIME_WAIT, FIN_WAIT2 b SYN_SENT, немного ESTABLISHED.

Сообщение объединено: 17 сентября 2013, 18:42:48

И количество TIME_WAIT быстро растет


mihail_1

#8
Может ли поток на все свои соединения (последовательные) использовать один сокет или после закрытия соединения он становится непригоден для повторного использования?

Сообщение объединено: 17 сентября 2013, 21:15:52

SO_REUSEADDR замечательная опция - при ее установке траффик упал в 10 раз.

mihail_1



SO_LINGER помогла. Но я не понял что за гнев богов меня ожидает и за что?