
Если моя программа на языке 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 ... )