2009-11-18 161 views
2

在Linux(內核2.6.20)上是否有API函數可用於檢查給定的TCP/IP端口是否被使用 - 綁定和/或連接?如何檢查端口是否可用

bind()唯一的解決方案(綁定到給定的端口使用套接字與SO_REUSEADDR選項,然後關閉它)?

回答

2

嗯,

根據strace -o trace.out netstat -at

netstat的通過查看

/proc/net/tcp 

/proc/net/tcp6 

所使用的端口執行此是在十六進制中的第二場該文件中的條目。

您可以通過查看第4個字段來獲得連接的狀態,例如,0A是LISTEN,01是ESTABLISHED。

+0

不錯,特別是使用strace。除了使用該文件,是否有直接的API調用? – CsTamas 2009-11-18 14:25:51

+0

不,看起來好像並不幸。 Berkley套接字API真的很簡潔,而且他們中的任何一個都不會做你正在做的事情。一些API(比如微軟)有非標準的擴展,這在Berkley套接字中是不可用的,但我認爲Linux沒有(爲了非常好的可移植性原因)。 – Benj 2009-11-18 15:50:41

0

抓住netstat命令的來源,看看它是如何看到的。但是,你將永遠有一場比賽。另外,SO_REUSEADDR不會讓你使用其他人正在使用的端口,當然,只有一個端口處於等待狀態。

1

神聖的便攜式BSD套接字API將不允許您在嘗試分配端口之前知道端口是否處於使用狀態。 不要試圖智取API。我知道這是多麼誘人,我曾經遇到過這種情況。但是任何表面上聰明的做法(例如proc文件系統)都容易產生微妙的錯誤,未來的兼容性問題,競爭條件等等。