在Linux(內核2.6.20)上是否有API函數可用於檢查給定的TCP/IP端口是否被使用 - 綁定和/或連接?如何檢查端口是否可用
是bind()
唯一的解決方案(綁定到給定的端口使用套接字與SO_REUSEADDR
選項,然後關閉它)?
在Linux(內核2.6.20)上是否有API函數可用於檢查給定的TCP/IP端口是否被使用 - 綁定和/或連接?如何檢查端口是否可用
是bind()
唯一的解決方案(綁定到給定的端口使用套接字與SO_REUSEADDR
選項,然後關閉它)?
嗯,
根據strace -o trace.out netstat -at
netstat的通過查看
/proc/net/tcp
和
/proc/net/tcp6
所使用的端口執行此是在十六進制中的第二場該文件中的條目。
您可以通過查看第4個字段來獲得連接的狀態,例如,0A是LISTEN,01是ESTABLISHED。
抓住netstat
命令的來源,看看它是如何看到的。但是,你將永遠有一場比賽。另外,SO_REUSEADDR
不會讓你使用其他人正在使用的端口,當然,只有一個端口處於等待狀態。
神聖的便攜式BSD套接字API將不允許您在嘗試分配端口之前知道端口是否處於使用狀態。 不要試圖智取API。我知道這是多麼誘人,我曾經遇到過這種情況。但是任何表面上聰明的做法(例如proc文件系統)都容易產生微妙的錯誤,未來的兼容性問題,競爭條件等等。
不錯,特別是使用strace。除了使用該文件,是否有直接的API調用? – CsTamas 2009-11-18 14:25:51
不,看起來好像並不幸。 Berkley套接字API真的很簡潔,而且他們中的任何一個都不會做你正在做的事情。一些API(比如微軟)有非標準的擴展,這在Berkley套接字中是不可用的,但我認爲Linux沒有(爲了非常好的可移植性原因)。 – Benj 2009-11-18 15:50:41