I have a list of devices on the network that I send discovery messages to them(on 255.255.255.255) and then they reply me with broadcast message as well(on 255.255.255.255 also).
I have multiple NICs, here's the route table(route -n):
0.0.0.0 192.168.0.1 0.0.0.0 UG 101 0 0 ens192
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens160
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
192.168.0.0 0.0.0.0 255.255.0.0 U 101 0 0 ens192
docker0 is irrelevant in this case.
Here's the ens192 and ens160 NICs relevant data from ifconfig:
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.15 netmask 255.255.255.0 broadcast 192.168.0.255
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.119 netmask 255.255.0.0 broadcast 192.168.255.255
Here's the code to handle the sending of the discovery and listeners:
import time
import socket
import logging
import threading
import SocketServer
class BroadcastMessageHandler(SocketServer.BaseRequestHandler):
def handle(self):
data = self.request[0].strip()
device_ip, port = self.client_address
print "{}:{}".format(device_ip, port)
def create_probing_listen_server(bind_interface, bind_port):
server = SocketServer.UDPServer((bind_interface, bind_port), BroadcastMessageHandler)
server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
return server
def create_send_server(bind_interface, bind_port):
send_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
send_server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
send_server.bind((bind_interface, bind_port,))
return send_server
def who_is(server, count):
for _ in xrange(count):
for message, port in [('msg1', 2000), ('msg2', 2001)]:
server.sendto(
message, ('255.255.255.255', port)
)
def discovery_server(server):
server.serve_forever()
def timer(listen_servers, server_timeout=5):
time.sleep(server_timeout)
for server in listen_servers:
try:
server.shutdown()
except (TypeError, AttributeError):
server.close()
broadcast_listener_servers = []
server_threads = []
for port in [2000, 2001]:
listen_server = create_probing_listen_server('0.0.0.0', port)
broadcast_listener_servers.append(listen_server)
server_threads.append(threading.Thread(name='listener_{}'.format(listen_server.socket.getsockname()[1]),
target=discovery_server,
args=(listen_server,)))
probe_send_server = create_send_server('192.168.0.15', 0)
probe_server_thread = threading.Thread(
name='probe', target=who_is, args=(
probe_send_server, 3,))
timer_thread = threading.Thread(name='timer', target=timer,
args=(broadcast_listener_servers + [probe_send_server],
5))
probe_server_thread.start()
for server_thread in server_threads:
server_thread.start()
timer_thread.start()
timer_thread.join()
Small explanation on the code:
- sender server to send the 255.255.255.255 broadcast message
- listener server on each of the expected port from the devices(binding on 0.0.0.0)
- timer thread to wait for X seconds and then shutdown all the servers
What am I doing wrong? I see my messages sent(and received!) on wireshark and on tcpdump aswell. Working on ubuntu.
Thank you.