2013-07-08 34 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