Назад | Перейти на главную страницу

Адрес уже используется ошибка

Когда вы запускаете программу для прослушивания TCP-сокета, а затем завершаете программу, иногда (но не всегда) вы получаете сообщение об ошибке типа «адрес уже используется», когда вы снова пытаетесь прослушивать сокет в течение следующих нескольких минут. Процесс завершается с помощью ctrl-c. Я пользуюсь linux.

Я думаю, что это как-то связано с застреванием TCP-соединения в состоянии CLOSE_WAIT, но я не уверен на 100%. Почему именно я получаю ошибку «адрес уже используется»?

Кроме того, почему это случается только иногда?

В IP-стеках есть функция, которая предотвращает слишком быстрое повторное открытие сокета в режиме прослушивания (я думаю, это 2-х минутное ожидание). Большинство современных программ удаляют эту функцию при создании сокета, используя флаг SO_REUSEADDR при создании сокета. Может ваша программа не использует этот флаг?

Попробуйте использовать netstat, чтобы увидеть состояние порта, или lsof -i: после того, как вы его убьете, чтобы увидеть, какие программы все еще используют порт, если таковые имеются.

На каком языке вы пишете?

Если вы пишете на C, возможно, вам нужно проверить setsockopt () или лучше выбрать ().

Как уже говорилось, есть функции, позволяющие сделать сокет многоразовым.