Обнаружение службы Python: реклама службы через локальную сеть

У меня есть "server" python script, работающий на одном из локальных сетевых компьютеров, который ждет, когда клиенты подключатся, и передаст им некоторую работу. Код сервера и клиента оба были написаны и работают как ожидалось...

Проблема в том, что этот сервер может работать с любого компьютера в локальной сети, поэтому я не могу жестко закодировать адрес в script... Я сразу же подумал, могу ли я сделать рекламу машины о ее существовании, и клиенты могут ответить на это. Это можно сделать в 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