Используя SO_REUSEADDR - Что, оказывается, ранее открывает сокет?

Вы можете просто поймать исключение:

order_by = self.request.GET.get('order_by', None)  # item_typea
try:
    queryset = Item.objects.order_by(order_by)
    # evaluate the queryset - that's when the exception will be thrown
except FieldError:
    # deal with error
27
задан genpfault 1 February 2013 в 21:38
поделиться

2 ответа

Да, ОС автоматически закрывает предыдущий сокет после завершения старого процесса. Причина, по которой вы не можете прослушивать один и тот же порт сразу же, заключается в том, что сокет, хотя он и закрыт, остается в состоянии 2MSL в течение некоторого времени (обычно несколько минут). ОС автоматически переводит старый сокет из этого состояния по истечении времени ожидания.

24
ответ дан 28 November 2019 в 05:03
поделиться

Сокет считается закрытым, когда программа, использующая его, умирает. Это многое обрабатывается ОС, и ОС откажется принимать любое дальнейшее сообщение из мертвого разговора. Однако, если сокет был неожиданно закрыт, компьютер на другом конце может не знать, что разговор окончен, и все еще может пытаться установить связь.

Именно поэтому в спецификации TCP предусмотрен период ожидания до того же номера порта можно использовать повторно. Поскольку теоретически, однако маловероятно, пакет из старого диалога может иметь возможность прибыть с соответствующим IP-адресом, номерами портов и порядковыми номерами, так что принимающий сервер по ошибке вставит его в неправильный поток TCP случайно.

Параметр SO_REUSEADDR отменяет это поведение, что позволяет сразу же повторно использовать порт. По сути, вы говорите: «Я понимаю риски и хотел бы в любом случае использовать порт».

29
ответ дан 28 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: