Broadcast(255.255.255.255) not received

Viewed 236

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.

0 Answers
Related