2014-01-19 48 views
0

我要編寫一個應用程序,顯示給定IP的UDP端口範圍內是否存在活動/非活動服務。使用套接字的活動服務(端口)

我的第一個意圖是試圖用一個地址綁定一個套接字(該端口包含在地址中)。如果失敗,綁定將返回-1,並帶有errno EADDRINUSE,這意味着指定的地址已被使用。如果綁定完成,我將關閉套接字並轉到下一個端口。

我有點迷茫的插座和網絡的東西,所以我想知道,如果我的方法是正確的,或者有關做到這一點的最佳方法的線索。

感謝

+0

根據操作系統的不同,通常還有其他方法可以找出正在使用的端口(對於Linux,例如,您可以查看netstat源)。 –

+0

你可以有多個連接,所以你的方法是行不通的。 –

+0

在Windows上,您可以使用['GetUdpTable()'](http://msdn.microsoft.com/en-us/library/windows/desktop/aa366033.aspx)和['GetUdp6Table()'](http: //msdn.microsoft.com/en-us/library/windows/desktop/bb408407.aspx)。 –

回答

1

在Windows上,你可以使用GetUdpTable()GetUdp6Table()問OS主動的IPv4/IPv6的UDP套接字的列表(也有相應的功能TCP套接字)。

+0

對不起,我忘記提及我使用Unix的套接字API –

+0

無論如何+1,因爲我將來可能會使用它。對不起,雙重發帖 –

1

在Linux中,/proc/net/udp文件列出了所有打開的UDP套接字。該文件中的第2列顯示接口地址和端口號(十六進制):

[[email protected] ~]# head -n 2 /proc/net/udp 
    sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 
    33: 00000000:00A1 00000000:0000 07 00000000:00000000 00:00000000 00000000  0  0 9236 2 ffff8102205a8980 

或者你可以運行netstat -au(在POSIX系統中,您可以使用popen()系統調用來運行程序並捕獲其輸出一個FILE *):

[[email protected] ~]# netstat -au 
Active Internet connections (servers and established) 
Proto Recv-Q Send-Q Local Address    Foreign Address    State 
udp  0  0 *:snmp      *:* 

bind()技術是不可靠的,因爲UDP允許multple綁定套接字到同一地址(取決於插座的設置)。

+0

我會嘗試使用這個,但我認爲它應該是一個更好/更簡單的方式,就像Windows一樣。並感謝您的綁定解釋。 –

+0

@TitoMc我沒有設計UNIX/Linux :)確實,Windows API的設計使用了與Linux/UNIX非常不同的理念。我不會試圖攻擊或防守。 – TypeIA

相關問題