我要編寫一個應用程序,顯示給定IP的UDP端口範圍內是否存在活動/非活動服務。使用套接字的活動服務(端口)
我的第一個意圖是試圖用一個地址綁定一個套接字(該端口包含在地址中)。如果失敗,綁定將返回-1,並帶有errno EADDRINUSE,這意味着指定的地址已被使用。如果綁定完成,我將關閉套接字並轉到下一個端口。
我有點迷茫的插座和網絡的東西,所以我想知道,如果我的方法是正確的,或者有關做到這一點的最佳方法的線索。
感謝
我要編寫一個應用程序,顯示給定IP的UDP端口範圍內是否存在活動/非活動服務。使用套接字的活動服務(端口)
我的第一個意圖是試圖用一個地址綁定一個套接字(該端口包含在地址中)。如果失敗,綁定將返回-1,並帶有errno EADDRINUSE,這意味着指定的地址已被使用。如果綁定完成,我將關閉套接字並轉到下一個端口。
我有點迷茫的插座和網絡的東西,所以我想知道,如果我的方法是正確的,或者有關做到這一點的最佳方法的線索。
感謝
在Windows上,你可以使用GetUdpTable()
和GetUdp6Table()
問OS主動的IPv4/IPv6的UDP套接字的列表(也有相應的功能TCP套接字)。
對不起,我忘記提及我使用Unix的套接字API –
無論如何+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綁定套接字到同一地址(取決於插座的設置)。
我會嘗試使用這個,但我認爲它應該是一個更好/更簡單的方式,就像Windows一樣。並感謝您的綁定解釋。 –
@TitoMc我沒有設計UNIX/Linux :)確實,Windows API的設計使用了與Linux/UNIX非常不同的理念。我不會試圖攻擊或防守。 – TypeIA
根據操作系統的不同,通常還有其他方法可以找出正在使用的端口(對於Linux,例如,您可以查看netstat源)。 –
你可以有多個連接,所以你的方法是行不通的。 –
在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)。 –