Если вы используете UDP, тогда конечная точка определяется либо:
- вызов
bind()
на сокете и явное присвоение ему адреса
- отправка пакета
Если вам нужны дополнительные сведения, проверьте этот ответ .
Проблема в том, что я не настолько знаком с витой. Из того, что я могу судить по быстрому изучению источника, похоже, что вы могли бы вместо этого использовать реактор типа t.i.d.SelectReactor
. Это то, что t.n.d.DNSDatagramProtocol
делает под капотом .
Если вы берете twisted
из картинки, то следующий фрагмент показывает, что происходит:
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
<socket._socketobject object at 0x10025d670>
>>> s.getsockname() # this is an unbound or unnamed socket
('0.0.0.0', 0)
>>> s.bind( ('0.0.0.0', 0) ) # 0.0.0.0 is INADDR_ANY, 0 means pick a port
>>> s.getsockname() # IP is still zero, but it has picked a port
('0.0.0.0', 56814)
Получить имя хоста немного сложнее, если вам нужно поддерживать несколько сетевых интерфейсов или IPv4 и IPv6. Если вы можете сделать используемый интерфейс настраиваемым, то передайте его в качестве первого члена кортежа на socket.bind()
, и вы настроены.
Теперь трудная часть делает это в рамках абстракций, которые предоставляет витая. К сожалению, я ничего не могу поделать там. Я бы порекомендовал поискать примеры того, как вы можете получить доступ к базовому сокету или найти способ передачи информации о сокете в каркас.
Удачи.