Tuve el mismo problema hoy; desafortunadamente, en mi sistema, el -T
opción de lsof
no acepta el f
bandera, y tampoco quería construir el knetstat
módulo del núcleo.
Afortunadamente, estaba en la posición de poder strace
la aplicación mientras estaba configurando el socket, así:
strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
Esto rastrea ./program arg1 arg2
, escribiendo el seguimiento en /tmp/log
. Solo rastreamos el setsockopt()
llamada al sistema, que se utiliza para establecer opciones de socket. La opción -f
hace strace
también rastree cualquier proceso secundario creado por el programa rastreado.
Si tienes suerte, /tmp/log
contendrá líneas como esta:
18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
Esto indica que el proceso 18806
llamado setsockopt()
en FD 60
para configurar SO_KEEPALIVE
a 1
(habilitándolo), y que la llamada al sistema tuvo éxito con el código de retorno 0
.
También es posible adjuntar a un proceso existente:
strace -e trace=setsockopt -f -o /tmp/log -p PID
Puede desconectarse del proceso usando CTRL-C
y omita el -o
opción y su argumento para enviar la traza a stderr
.
En Linux, puede usar el módulo de kernel knetstat para inspeccionar las opciones de socket, incluido SO_BROADCAST
.
Puedes usar lsof(8)
. Si PID
es el ID del proceso y FD
es el número del descriptor de archivo del socket que le interesa, puede hacer esto:
lsof -a -p PID -d FD -T f
Para listar todos los sockets IPv4 de un proceso:
lsof -a -p PID -i 4 -T f
Esto imprimirá las opciones de socket con un SO=
, entre otra información. Tenga en cuenta que si no se configuran opciones, obtendrá la cadena vacía, por lo que verá algo como SO=PQLEN=0
etc. Para probar SO_BROADCAST
, solo grep para la cadena SO_BROADCAST
después del SO=
, por ejemplo
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi