显示套接字选项

时间:2009-12-01 05:11:06

标签: linux shell

我如何从shell中看到设置了哪些套接字选项?特别是 我很有兴趣知道是否设置了SO_BROADCAST?

3 个答案:

答案 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

相关问题