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