2013-07-08 36 views
11

我的程序打开这种功能的插座:检查所有插座在Linux操作系统打开

的sockfd =插座(AF_INET,SOCK_RAW,IPPROTO_ICMP)

发送完数据后关闭套接字:

close(sockfd);

但问题是,当程序运行不正常,并阻止。从而套接字不会被关闭。

如何检查在Linux操作系统下打开的所有套接字?

+2

询问的打开“文件”列表lsof的 – doctorlove

+0

如果您需要在代码来处理,你应该在需要时保持有效的套接字的列表和关闭。 – VoidPointer

+0

很少有题目,你应该检查socketfd的值(从套接字返回)以获得更好的错误处理。 –

回答

20

的/ proc /净/ TCP -a打开TCP套接字

的列表

的/ proc /净开放UDP套接字

的/ UDP -a列表

的/ proc /净/生-a列出所有'raw'socket

这些是文件,使用cat命令查看它们。例如:

cat /proc/net/tcp

您也可以使用lsof命令。

lsof的是命令的意思是“列表中打开文件”,这是在许多 类Unix系统中报告所有打开的文件和打开它们的进程 的列表。

+2

这些命令在ubuntu(Ubuntu/Linaro 4.6.1-9ubuntu3)中不工作) ===> root @ root:/ home/aa/test#/ proc/net/** ::::: ** dev_snmp6/netfilter/rpc/stat/** –

+2

这些都是文件,用cat命令查看,就像'cat/proc/net/tcp' –

+0

通常使用'lsof'代替这些更容易。 – Hasturkun

10

您可以使用netstat的命令

netstat的--listen

要显示打开的端口建立TCP连接,

netstat的-vatn

要显示只开放UDP端口尝试使用以下命令:

netstat的-vaun

+0

RAW ICMP套接字不会显示在我的系统上的netstat中。 Chankeys在CentOS上为我解答'cat/proc/net/raw' – Tricky

+0

@tricky这是因为你必须使用* netstat -w -l *,或者更好的是* ss -w -l *。这些命令将显示*监听*原始套接字。如果您需要更多信息,请使用* ss -w -lnp *。 – MariusMatutiae

15

你也可以使用SS实用程序来转储插座的统计数据。

转储总结:

ss -s 

Total: 91 (kernel 0) 
TCP: 18 (estab 11, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0 

Transport Total  IP  IPv6 
*   0   -   -   
RAW  0   0   0   
UDP  4   2   2   
TCP  18  16  2   
INET  22  18  4   
FRAG  0   0   0 

要显示所有插口:

ss -a 

要显示UDP套接字:

​​

要显示TCP套接字:

ss -t -a 

在这里,你可以阅读SS人:ss