Как ОС определяет, что «адрес уже используется»?

Как ОС определяет, что «адрес уже используется»?

Если моя программа на языке C использует сокеты, привязывается к localhost:9025, обменивается данными, вручную завершается и перезапускается, она иногда аварийно завершается с ошибкой:

Адрес уже используется.

Все рекомендованные SE программы, в которых я пытался найти «pid, использующий порт», не смогли вернуть ни одного идентификатора процесса, поэтому я предполагаю, что в данный момент нет процесса, использующего порт 9025, что и должно быть так.

Тем не менее, из того, что я собрал из комментариев по тематическим похожим вопросам, мне показалось, что "Адрес" "уже используется", если и только если процесс использует этот конкретный адрес. Почему же тогда это ложно?

Теперь я предполагаю, что ОС отслеживает, какие адреса используются, а какие нет, но так ли это? Если это так, я был бы рад, если бы вы могли мне сказать, как это исправить, потому что мое лучшее решение этой проблемы — «ждать неопределенное количество времени».

EDIT: Я использую Linux 5.2.2-arch1-1-ARCH x86_64

решение1

Вероятно, вы слишком быстро перезапускаете программу или программа не закрывает сокет.

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

Решение состоит в том, чтобы установить опцию сокета в программе с помощью setsockopt так:

setsockopt(socket,SOL_SOCKET,SO_REUSEADDR ... )

Связанный контент