我在客户端应用程序失败上运行strace
并得到如下信息:
socket(PF_LOCAL, SOCK_SEQPACKET|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
setsockopt(3, SOL_SOCKET, SO_PASSCRED, [1], 4) = 0
connect(3, {sa_family=AF_LOCAL, sun_path="/path/to/socket"}, 19) = -1 EPROTOTYPE (Protocol wrong type for socket)
close(3) = 0
exit_group(2) = ?
+++ exited with 2 +++
然后我尝试猜测通过使用各种参数来模拟套接字socat
,但没有效果。
我还查看了这个答案中的代码这里,但它似乎正在制作一个套接字,而不是使用现有的套接字,而且我似乎无法找到如何从路径获取套接字。
在不深入源码的情况下,是否有一种简单的方法可以从套接字的路径(如果存在)确定现有套接字的详细信息(例如协议类型)?
答案1
您可以使用lsof /path/to/socket
:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
hindsight 19619 root 6u unix 0xffff88038612b480 0t0 257123917 /path/to/socket
了解了PID
您可以找到有关该过程本身的更多信息:
cat /proc/19619/io
rchar: 11635200437
wchar: 2722080850
syscr: 16905056
syscw: 920240
read_bytes: 36397568
write_bytes: 3515994112
cancelled_write_bytes: 760422400
或者您可以用于ss
显示所有 Unix 套接字。
ss -x
-x
显示 Unix 域套接字-e
显示详细的套接字信息-m
显示套接字内存使用情况
您可以过滤某种类型:
ss -x -A unix_stream