How I can see from shell what socket options are set? In particular I\'m interesting to know if SO_BROADCAST is set?
On Linux, you can use the knetstat kernel module to inspect socket options, including SO_BROADCAST
.
I had the same issue today; unfortunately, on my system, the -T
option of lsof
doesn't accept the f
flag, and I also didn't want to build the knetstat
kernel module.
Luckily, I was in the position of being able to strace
the application while it was setting up the socket, like this:
strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
This traces ./program arg1 arg2
, writing the trace to /tmp/log
. We only trace the setsockopt()
system call, which is used to set socket options. The option -f
makes strace
also trace any child processes created by the traced program.
If you are lucky, /tmp/log
will contain lines like this one:
18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
This indicates that process 18806
called setsockopt()
on FD 60
to set SO_KEEPALIVE
to 1
(enabling it), and that the system call succeeded with return code 0
.
It's also possible to attach to an existing process:
strace -e trace=setsockopt -f -o /tmp/log -p PID
You can detach from the process using CTRL-C
, and omit the -o
option and its argument to send the trace to stderr
.
You can use lsof(8). If PID
is the process ID and FD
is the file descriptor number of the socket you're interested in, you can do this:
lsof -a -p PID -d FD -T f
To list all IPv4 sockets of a process:
lsof -a -p PID -i 4 -T f
This will print out the socket options with a SO=
, among other information. Note that if no options are set, you'll get the empty string, so you'll see something like SO=PQLEN=0
etc. To test for SO_BROADCAST
, just grep for the string SO_BROADCAST
after the SO=
, e.g.
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi