Ich habe strace
bei einem Client-Anwendungsfehler einen Fehler ausgeführt und das Ergebnis war ungefähr wie folgt:
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 +++
Ich habe dann versucht,erratenden Socket-Typ, indem der Socket vor Ort mit verschiedenen Parametern emuliert wird socat
, jedoch ohne Erfolg.
Ich habe mir auch den Code aus dieser Antwort angesehenHier, aber es scheint, als würde ein Socket erstellt und kein vorhandener verwendet, und ich kann anscheinend nicht herausfinden, wie ich einen Socket aus einem Pfad erhalte.
Gibt es eine einfache Möglichkeit, die Details (z. B. den Protokolltyp) eines vorhandenen Sockets anhand des Socket-Pfads (sofern vorhanden) zu ermitteln, ohne den Quellcode zu durchsuchen?
Antwort1
Sie können Folgendes verwenden 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
Wenn Sie das wissen, PID
können Sie mehr über den Prozess selbst erfahren:
cat /proc/19619/io
rchar: 11635200437
wchar: 2722080850
syscr: 16905056
syscw: 920240
read_bytes: 36397568
write_bytes: 3515994112
cancelled_write_bytes: 760422400
Oder Sie können es ss
zur Anzeige aller Unix-Sockets verwenden.
ss -x
-x
Anzeige von Unix-Domain-Sockets-e
Detaillierte Socket-Informationen anzeigen-m
Socket-Speichernutzung anzeigen
und Sie können nach einem bestimmten Typ filtern:
ss -x -A unix_stream