Ho avuto lo stesso problema oggi; sfortunatamente, sul mio sistema, il -T opzione di lsof non accetta il f flag, e inoltre non volevo creare il knetstat modulo del kernel.
Fortunatamente, ero nella posizione di poter strace l'applicazione mentre stava configurando il socket, in questo modo:
strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
Questo traccia ./program arg1 arg2 , scrivendo la traccia in /tmp/log . Tracciamo solo il setsockopt() chiamata di sistema, che viene utilizzata per impostare le opzioni del socket. L'opzione -f fa strace traccia anche qualsiasi processo figlio creato dal programma tracciato.
Se sei fortunato, /tmp/log conterrà righe come questa:
18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
Ciò indica che il processo 18806 chiamato setsockopt() su FD 60 per impostare SO_KEEPALIVE a 1 (abilitandolo) e che la chiamata di sistema è riuscita con codice di ritorno 0 .
È anche possibile collegarsi a un processo esistente:
strace -e trace=setsockopt -f -o /tmp/log -p PID
Puoi staccarti dal processo usando CTRL-C e ometti -o opzione e il suo argomento per inviare la traccia a stderr .
Su Linux, puoi utilizzare il modulo del kernel knetstat per ispezionare le opzioni del socket, incluso SO_BROADCAST .
Puoi usare lsof(8) . Se PID è l'ID del processo e FD è il numero del descrittore di file del socket che ti interessa, puoi farlo:
lsof -a -p PID -d FD -T f
Per elencare tutti i socket IPv4 di un processo:
lsof -a -p PID -i 4 -T f
Questo stamperà le opzioni del socket con un SO= , tra le altre informazioni. Nota che se non sono impostate opzioni, otterrai la stringa vuota, quindi vedrai qualcosa come SO=PQLEN=0 ecc. Per testare SO_BROADCAST , solo grep per la stringa SO_BROADCAST dopo il SO= , ad esempio
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi