listen on a particular interface

update-annotate
Brian Moran 2024-02-22 18:39:55 -08:00
rodzic 7feaa47d4f
commit 725833ba1a
1 zmienionych plików z 10 dodań i 5 usunięć

Wyświetl plik

@ -20,6 +20,7 @@ class SimpleServer(object):
def __init__(self, ip_address='127.0.0.1', udp_port=DEFAULT_UDP_PORT, **kwargs): def __init__(self, ip_address='127.0.0.1', udp_port=DEFAULT_UDP_PORT, **kwargs):
self.timeout = None self.timeout = None
self.verbose = kwargs.get("verbose",False) self.verbose = kwargs.get("verbose",False)
self.interface = kwargs.get("interface", "127.0.0.1")
if kwargs.get("timeout") is not None: if kwargs.get("timeout") is not None:
self.timeout = kwargs.get("timeout") self.timeout = kwargs.get("timeout")
@ -33,17 +34,21 @@ class SimpleServer(object):
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
self.sock.bind((ip_address, int(udp_port))) self.sock.bind((ip_address, int(udp_port)))
else: else:
self.multicast_setup(ip_address, udp_port) self.multicast_setup(ip_address, udp_port, self.interface)
if self.timeout is not None: if self.timeout is not None:
self.sock.settimeout(self.timeout) self.sock.settimeout(self.timeout)
def multicast_setup(self, group, port=''): def multicast_setup(self, group, port='', interface='127.0.0.1'):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) print("Multicast setup addr %s port %s interface %s" % (group, port, interface))
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP
, socket.inet_aton(group) + socket.inet_aton(interface))
self.sock.bind(('', port)) self.sock.bind(('', port))
mreq = struct.pack("4sl", socket.inet_aton(group), socket.INADDR_ANY) # TODO in the future be able to handle more than one address?
self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) #mreq = struct.pack("4s4s", socket.inet_aton(group), socket.inet_aton(interface)) # INADDR_ANY)
#self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
def rx_packet(self): def rx_packet(self):
try: try: