Detectando onde ligar para receber uma transmissão UDP

1

Estou escrevendo um aplicativo que precisa capturar e imprimir transmissões UDP. A interface de rede em uso é:

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.1  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::a00:27ff:feb9:b18c  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:b9:b1:8c  txqueuelen 1000  (Ethernet)

Os pacotes são recebidos e impressos com sucesso para os estados abaixo.

$ sudo lsof -P -iUDP
python3   5496            root    3u  IPv4  54675      0t0  UDP *:67

$ sudo strace python3 main.py 2>&1 | grep bind
bind(3, {sa_family=AF_INET, sin_port=htons(67), sin_addr=inet_addr("0.0.0.0")}, 16) = 0

Eu preciso ter a ligação para um endereço específico e nem todos os endereços 0.0.0.0 . Então eu mudo o script para ligar para imitar o comportamento 0.0.0.0 e loop e ligar a qualquer endereço possível na sub-rede. Resultado sendo:

$ sudo lsof -P -iUDP
python3   5472            root    3u  IPv4  52392      0t0  UDP 192.168.10.0:67 
python3   5472            root    4u  IPv4  52393      0t0  UDP user-VirtualBox:67 
python3   5472            root    6u  IPv4  52647      0t0  UDP 192.168.10.255:67 

No entanto, o aplicativo ainda não imprime nada.

Pergunta

Existe uma diferença entre a vinculação a 0.0.0.0 em oposição à vinculação a todos os endereços possíveis que podem fazer com que um pacote não seja passado para o aplicativo userspace?

    
por TheMeaningfulEngineer 23.12.2016 / 23:56

1 resposta

0

Os clientes DHCP enviam solicitações para 255.255.255.255.67 , portanto, ouvir algo que pode recebê-las seria benéfico para um servidor DHCP. No teste, algo vinculado ao equivalente ao seu endereço de escuta 192.168.10.255:bootps não vê esses pacotes.

O que obriga a necessidade de se vincular a algo que não é *:67 ?

    
por 24.12.2016 / 00:56