J'ai eu le même problème aujourd'hui; malheureusement, sur mon système, le -T
possibilité de lsof
n'accepte pas le f
flag, et je ne voulais pas non plus construire le knetstat
module noyau.
Heureusement, j'étais en mesure de pouvoir strace
l'application lors de la configuration du socket, comme ceci :
strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
Cela trace ./program arg1 arg2
, en écrivant la trace dans /tmp/log
. Nous ne traçons que le setsockopt()
appel système, qui est utilisé pour définir les options de socket. L'option -f
fait strace
trace également tous les processus enfants créés par le programme tracé.
Si vous avez de la chance, /tmp/log
contiendra des lignes comme celle-ci :
18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
Cela indique que le processus 18806
appelé setsockopt()
sur FD 60
pour définir SO_KEEPALIVE
à 1
(en l'activant) et que l'appel système a réussi avec le code de retour 0
.
Il est également possible de rattacher à un processus existant :
strace -e trace=setsockopt -f -o /tmp/log -p PID
Vous pouvez vous détacher du processus en utilisant CTRL-C
, et omettez le -o
option et son argument pour envoyer la trace à stderr
.
Sous Linux, vous pouvez utiliser le module du noyau knetstat pour inspecter les options de socket, y compris SO_BROADCAST
.
Vous pouvez utiliser lsof(8)
. Si PID
est l'ID du processus et FD
est le numéro de descripteur de fichier du socket qui vous intéresse, vous pouvez faire ceci :
lsof -a -p PID -d FD -T f
Pour lister tous les sockets IPv4 d'un processus :
lsof -a -p PID -i 4 -T f
Cela imprimera les options de socket avec un SO=
, entre autres informations. Notez que si aucune option n'est définie, vous obtiendrez la chaîne vide, vous verrez donc quelque chose comme SO=PQLEN=0
etc. Pour tester SO_BROADCAST
, juste grep pour la chaîne SO_BROADCAST
après le SO=
, par exemple
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi