Пожалуйста помоги,

Сначала я создал сокет и привязал его к адресу без SO_REUSEADDR.

Затем моя программа разбилась (сокет не закрывается должным образом)

Затем я запускаю его снова, и bind () возвращает «Адрес уже используется».

Я попытался изменить исходный код для использования SO_REUSEADDR, но он бесполезен.

Теперь я не смог снова запустить bind (сервер не может быть перезагружен)

2
Silver Wolf 31 Янв 2013 в 12:29
2
Если за 4 минуты никто не добавит полезного ответа, попробуйте еще раз, и все должно сработать :)
 – 
Anton Kovalenko
31 Янв 2013 в 12:34
Кроме того, некоторые ответы на serverfault.com/questions/329845/… может быть полезным.
 – 
Anton Kovalenko
31 Янв 2013 в 12:35
3
Флаг SO_REUSEADDR должен быть установлен для сокета, который сейчас находится в TIME_WAIT состояние. Итак, все, что вы можете сделать, это дождаться тайм-аута и не забыть установить флаг в своей программе, чтобы это больше не повторилось.
 – 
Some programmer dude
31 Янв 2013 в 12:35
Вы неправильно изменили исходный код. Покажите код, который создает сокет и устанавливает SO_REUSEADDR.
 – 
nos
31 Янв 2013 в 13:14
1
Я не верю, что это правильно для TCP. Я подозреваю, что он просто не установил SO_REUSEADDR перед вызовом bind ().
 – 
user207421
31 Янв 2013 в 15:21

1 ответ

Лучший ответ

Вам просто нужно подождать, пока время сеанса не истечет, после чего он будет полностью удален.

Когда сеанс завершается "грязным" образом, вы не можете повторно использовать этот адрес снова (при условии, что вы не используете SO_REUSEADDR) для удвоения максимального срока жизни сегмента - обычно это около четырех минут для обычного сетевого оборудования, хотя на самом деле это зависит от от свойств среды (например, спутники могут иметь больший MSL).

Это сделано для того, чтобы гарантировать, что все еще находящиеся в переходе пакеты не поступят, и испортить вашу последовательность в новом сеансе.

6
paxdiablo 31 Янв 2013 в 12:32