Пожалуйста помоги,
Сначала я создал сокет и привязал его к адресу без SO_REUSEADDR.
Затем моя программа разбилась (сокет не закрывается должным образом)
Затем я запускаю его снова, и bind () возвращает «Адрес уже используется».
Я попытался изменить исходный код для использования SO_REUSEADDR, но он бесполезен.
Теперь я не смог снова запустить bind (сервер не может быть перезагружен)
1 ответ
Вам просто нужно подождать, пока время сеанса не истечет, после чего он будет полностью удален.
Когда сеанс завершается "грязным" образом, вы не можете повторно использовать этот адрес снова (при условии, что вы не используете SO_REUSEADDR) для удвоения максимального срока жизни сегмента - обычно это около четырех минут для обычного сетевого оборудования, хотя на самом деле это зависит от от свойств среды (например, спутники могут иметь больший MSL).
Это сделано для того, чтобы гарантировать, что все еще находящиеся в переходе пакеты не поступят, и испортить вашу последовательность в новом сеансе.
Похожие вопросы
Связанные вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
SO_REUSEADDR
должен быть установлен для сокета, который сейчас находится вTIME_WAIT
состояние. Итак, все, что вы можете сделать, это дождаться тайм-аута и не забыть установить флаг в своей программе, чтобы это больше не повторилось.