我如何从shell中看到设置了哪些套接字选项?特别是 我很有兴趣知道是否设置了SO_BROADCAST?
答案 0 :(得分:8)
您可以使用lsof(8)
。如果PID
是进程ID,而FD
是您感兴趣的套接字的文件描述符编号,则可以执行以下操作:
lsof -a -p PID -d FD -T f
列出进程的所有IPv4套接字:
lsof -a -p PID -i 4 -T f
这将使用SO=
打印出套接字选项,以及其他信息。请注意,如果没有设置任何选项,您将获得空字符串,因此您会看到类似SO=PQLEN=0
等的内容。要测试SO_BROADCAST
,只需查看字符串SO_BROADCAST
之后的grep SO=
,例如
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi
答案 1 :(得分:4)
在Linux上,您可以使用knetstat内核模块来检查套接字选项,包括SO_BROADCAST
。
答案 2 :(得分:1)
我今天有同样的问题;不幸的是,在我的系统上,-T
的{{1}}选项不接受lsof
标志,并且我也不想构建f
内核模块。 / p>
幸运的是,我能够knetstat
在设置套接字的过程中使用该应用程序,如下所示:
strace
这将跟踪strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
,并将跟踪写入./program arg1 arg2
。我们仅跟踪/tmp/log
系统调用,该系统调用用于设置套接字选项。选项setsockopt()
使-f
也跟踪由被跟踪程序创建的所有子进程。
如果幸运的话,strace
将包含以下内容:
/tmp/log
这表明进程18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
在FD 18806
上调用了setsockopt()
,将60
设置为SO_KEEPALIVE
(启用了该功能),并且系统调用成功返回代码1
。
还可以附加到现有流程:
0
您可以使用strace -e trace=setsockopt -f -o /tmp/log -p PID
从进程中分离出来,并省略CTRL-C
选项及其参数以将跟踪发送到-o
。