Обнаружение службы Python: реклама службы в локальной сети

У меня есть "серверный" сценарий Python, запущенный на одном из компьютеров локальной сети, который ожидает подключения клиентов и передает им некоторую работу. Серверный и клиентский код были написаны и работают как положено...

Проблема в том, что этот сервер может быть запущен с любой машины в локальной сети, поэтому я не могу жестко закодировать адрес в сценарии... Я сразу подумал, смогу ли я заставить машину сообщить о ее существовании, и клиенты могут ответить к этому. Это выполнимо в Python со стандартной библиотекой? У меня действительно нет времени, чтобы загрузить витые или торнадо и узнать о них, к сожалению, поэтому мне нужно что-то простое.

Я попытался обдумать это и понял, что у меня может быть один статический IP-компьютер, на котором серверы регистрируются / отменяются, а клиенты могут искать серверы оттуда. Думаю, что-то вроде торрент-трекера. Это придется делать, если я не могу легко сделать сервисный подход к рекламе.

1 ответ

Решение

Простой способ сделать объявление / обнаружение услуги в локальной сети - это широковещательная рассылка UDP-пакетов.

Константы:

PORT = 50000
MAGIC = "fna349fn" #to make sure we don't confuse or get confused by other programs

Объявление:

from time import sleep
from socket import socket, AF_INET, SOCK_DGRAM, SOL_SOCKET, SO_BROADCAST, gethostbyname, gethostname

s = socket(AF_INET, SOCK_DGRAM) #create UDP socket
s.bind(('', 0))
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) #this is a broadcast socket
my_ip= gethostbyname(gethostname()) #get our IP. Be careful if you have multiple network interfaces or IPs

while 1:
    data = MAGIC+my_ip
    s.sendto(data, ('<broadcast>', PORT))
    print "sent service announcement"
    sleep(5)

Discovery:

from socket import socket, AF_INET, SOCK_DGRAM

s = socket(AF_INET, SOCK_DGRAM) #create UDP socket
s.bind(('', PORT))

while 1:
    data, addr = s.recvfrom(1024) #wait for a packet
    if data.startswith(MAGIC):
        print "got service announcement from", data[len(MAGIC):]

Этот код был адаптирован из демо на python.org

Другие вопросы по тегам