Для обнаружения узлов в локальной сети я использовал Twisted и UDP Multicast. Надеюсь, вам это тоже поможет.
Ссылка на искаженную документацию, объясняющую, как это сделать:
https://twistedmatrix.com/documents/current/core/howto/udp.html#auto3
Вот базовая реализация сервера / клиента на основе витого кода.
Он сам ответит, если вы запустите один раз, но весь проверочный код и дополнительные функции были удалены, чтобы его было проще читать.
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
class MulticastPingPong(DatagramProtocol):
MULTICAST_ADDR = ('228.0.0.5', 8005)
CMD_PING = "PING"
CMD_PONG = "PONG"
def startProtocol(self):
"""
Called after protocol has started listening.
"""
# Set the TTL>1 so multicast will cross router hops:
self.transport.setTTL(5)
# Join a specific multicast group:
self.transport.joinGroup(self.MULTICAST_ADDR[0])
self.send_alive()
def send_alive(self):
"""
Sends a multicast signal asking for clients.
The receivers will reply if they want to be found.
"""
self.transport.write(self.CMD_PING, self.MULTICAST_ADDR)
def datagramReceived(self, datagram, address):
print "Datagram %s received from %s" % (repr(datagram), repr(address))
if datagram.startswith(self.CMD_PING):
# someone publishes itself, we reply that we are here
self.transport.write(self.CMD_PONG, address)
elif datagram.startswith(self.CMD_PONG):
# someone reply to our publish message
print "Got client: ", address[0], address[1]
if __name__ == '__main__':
reactor.listenMulticast(8005, MulticastPingPong(), listenMultiple=True)
reactor.run()