asyncio — открыть соединение с использованием определенного интерфейса

#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. Обновленный ответ.