Могут ли исходные и целевые порты TCPv4 конфликтовать друг с другом? Или порты источника и назначения живут в своих собственных адресных пространствах?

Операторы печати будут выполняться всякий раз, когда генератор переименован. Если вы просто хотите посмотреть, что печатает итератор, вы можете вызвать его в понимании списка, не сохраняя результат.

def testFunc(arg1):
    print arg1
    yield arg1

>>> [_ for _ in testFunc(1)]
1
[1]
3
задан Douglas 21 January 2019 в 22:29
поделиться

1 ответ

Спецификация TCP говорит, что соединения идентифицируются кортежем:

{local addr, local port, remote addr, remote port}

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

Однако, большинство реализаций TCP, включая API сокетов Unix, являются более строгими, чем эта. Если локальный порт уже используется в каком-либо существующем сокете, вы не сможете связать его, вы получите ошибку EADDRINUSE. Специальное исключение делается, если все существующие сокеты находятся в состоянии TIME_WAIT, а новый сокет имеет опцию сокета SO_REUSEADDR; это используется для перезапуска сервера, пока сокеты, оставшиеся от предыдущего процесса, все еще ожидают истечения времени ожидания.

По этой причине диапазон портов обычно делится на диапазоны с различным использованием. Когда сокет не связывает локальный порт (либо потому, что он просто вызвал connect() без вызова bind(), либо путем указания IPPORT_ANY в качестве порта в bind()), порт выбирается из эфемерного диапазон, который обычно очень пронумерован портами. С другой стороны, ожидается, что серверы будут привязаны к портам с низким номером. Если сетевые приложения следуют этому соглашению, вы не должны сталкиваться с конфликтами.

0
ответ дан Barmar 21 January 2019 в 22:29
поделиться
Другие вопросы по тегам:

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