Abbiamo un software esistente che trasmette periodicamente pacchetti UDP a una porta specifica (7125) nella subnet locale (x.x.x.255). Abbiamo un software di monitoraggio in esecuzione su HP-UX (11.11) che è in grado di ricevere questi pacchetti senza problemi. Tuttavia, dopo aver trasferito il software di monitoraggio su Linux (RHEL 6.1), abbiamo scoperto che non riceve i pacchetti di trasmissione. tcpdump mostra i pacchetti che arrivano sull'host Linux, ma il kernel non li invia attraverso il nostro software.Ricezione di pacchetti broadcast UDP su Linux
Ho utilizzato un paio di script python 2.x che simulano le API socket chiamate che il software di monitoraggio utilizza per testare diversi scenari. Il kernel Linux passa i pacchetti al software del ricevitore se il mittente usa unicast (10.1.0.5), ma non trasmesso (10.1.0.255). Ho cercato sul Web per diversi giorni e non ho trovato nessuno con lo stesso problema. Qualche idea?
receiver.py
from __future__ import print_function
import socket
localHost = ''
localPort = 7125
remoteHost = '10.1.0.5'
remotePort = 19100
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((localHost, localPort))
s.connect((remoteHost, remotePort))
print('Listening on {0}:{1} for traffic from {2}:{3}'.format(localHost, localPort, remoteHost, remotePort))
data = s.recv(1024)
print('Received: {0}'.format(data))
s.close()
sender.py
from __future__ import print_function
import socket
import time
localHost = ''
localPort = 19100
remoteHost = '10.1.0.255'
remotePort = 7125
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((localHost, localPort))
s.connect((remoteHost, remotePort))
data = 'sending this from {0}:{1} to {2}:{3}'.format(localHost, localPort, remoteHost, remotePort)
print(data)
print('2')
time.sleep(1)
print('1')
time.sleep(1)
s.send(data)
print('sent at {0}'.format(time.ctime()))
s.close()
Il ricevitore non deve "legare" all'indirizzo di broadcast o "INADDR_BROADCAST" (255.255.255.255, il 'INADDR_ANY' di trasmissione)? Cioè, oltre all'impostazione dell'opzione 'SO_BROADCAST' (su entrambi i lati), come stai già facendo. Stai controllando i codici di errore/di ritorno di tutte queste chiamate di sistema socket? –
@MatthewHall aha, il binding all'indirizzo di broadcast funziona! Immagino che questo significhi che Linux ti faccia scegliere tra unicast e broadcast? Siamo in grado di associare a 'INADDR_ANY' e ricevere pacchetti unicast e broadcast su HP-UX. – goose
Sì, sembra che tu debba scegliere. Ho pubblicato una risposta canonica alla tua domanda. Tuttavia, sono un po 'confuso dal fatto che il comportamento differisca su Linux da HP-UX (anche se ci sono degli argomenti sul perché la separazione tra broadcast e unicast sarebbe preferibile). Per me, questo suggerisce che non sappiamo tutto, e bene, è inaccettabile come al solito. Sono tentato di scrivere un paio di programmi di test in C per arricchire completamente le opzioni di trasmissione su Linux, anche se non ho HP-UX ... Fino ad allora, spero che la mia risposta lo copra. –