#python #sockets #python-asyncio
#python #сокеты #python-asyncio
Вопрос:
Я пытаюсь перейти к некоторому коду, чтобы использовать asyncio (по разным причинам). В моем существующем коде я создаю сокет, который я bind()
подключаю к определенному интерфейсу, чтобы гарантировать, что TCP-соединение установлено на этом интерфейсе:
_TCP_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
_TCP_Socket.bind(('169.254.6.1', 13000)) # All data sent from this IP, Port (i.e using the interface that has this IP)
_TCP_Socket.connect(('169.254.10.123, 13000))
Вышеуказанное работает, но как мне добиться того же в asyncio? т. Е. Как мне выбрать интерфейс для отправки? С asyncio.open_connection()
нет bind()
как такового.
Итак, я передаю ему сокет? т. Е. создать сокет, как и раньше, который привязан к интерфейсу, с которого я хочу отправить, а затем вызвать open_connection
?
reader, writer = await asyncio.open_connection('169.254.10.123', 13000, sock=_TCP_Socket) # Use _TCP_Socket created earlier?
Ответ №1:
В документации говорится, что у asyncio.open_connection
есть именованный параметр local_addr
, описание которого можно найти в описании create_connection:
если задано, является
(local_host, local_port)
кортежем, используемым для привязки сокета к локальному.
Потому что open_connection
это оболочка для create_connection
, а документы содержат следующее предложение:
Остальные аргументы передаются непосредственно в loop.create_connection().
Комментарии:
1. Я не мог видеть в документах, где это описано
local_addr
— где вы нашли эту информацию?2. Обновленный ответ.