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