2015-05-26 2 views
1

У меня есть гнездо в соответствии с:Python сокет связываются 0.0.0.0, проверьте входящее сообщение

self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
self.socket.bind(('0.0.0.0', 67)) # Listen on port 67 

Теперь сокет прослушивает все интерфейсы в порту 67. Я выждать некоторое сообщение:

message, address = self.socket.recvfrom(8192) # Blocking 

Когда сообщение получено, я хотел бы отправить ответ широковещания на порт 68 на том же интерфейсе, который получал сообщение.

Вопрос: есть ли способ проверить сообщение и определить, какой сетевой интерфейс получил сообщение, и если да, как я могу отправить ответ и предоставить этот интерфейс для транспорта?

Работает под Windows, Python 3.4.

+0

Possibily родственный - [Как сказать, какой интерфейс сокет получил сообщение от?] (http://stackoverflow.com/questions/603577/how-to-tell-which-interface-the-socket-received-the-message-from) – jweyrich

ответ

1

Вы не можете. Вы могли различать только интерфейсы, если бы вы привязывались к каждому IP-адресу отдельно (чтобы открыть сокет для каждого интерфейса).

EDIT: в качестве @jweyrich отметил в комментариях ниже, на Windows, опция сокета называется IP_PKTINFO (конечно Linux also) может предоставить информацию - если она реализована

+0

Вы можете, строго говоря о UDP - см. [IP_PKTINFO] (http://linux.die.net/man/7/ip) – jweyrich

+0

@jweyrich не все используют linux ... – knitti

+0

действительно, мой плохой - [для windows] (https: // msdn. microsoft.com/en-us/library/windows/desktop/hh285668%28v=vs.85% 29.aspx). Просто не уверен, что это будет работать над абстракцией сокета Python. Я не читал код, чтобы узнать, использует ли он 'WSARecvMsg' внутри себя. – jweyrich

Смежные вопросы