我打算编写一个应用程序来显示给定IP的UDP端口范围内是否存在活动/非活动服务。
我的第一个意图是尝试将套接字与地址绑定(端口包含在地址中)。如果失败,绑定将返回-1,并带有错误的EADDRINUSE,这意味着指定的地址已被使用。如果绑定完成,我将关闭套接字,然后转到下一个端口。
我对套接字和网络有点遗失,所以我想知道我的方法是否正确,或者了解最佳方法。
由于
答案 0 :(得分:1)
在Windows上,您可以使用GetUdpTable()
和GetUdp6Table()
向操作系统询问有效的IPv4 / IPv6 UDP套接字列表(TCP套接字有相应的功能)。
答案 1 :(得分:1)
在Linux中,/proc/net/udp
文件列出了所有打开的UDP套接字。文件中的第二列显示接口地址和端口号(十六进制):
[root@localhost ~]# 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 *
):
[root@localhost ~]# netstat -au
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 *:snmp *:*
您的bind()
技术不可靠,因为UDP允许多个绑定套接字到相同的地址(取决于套接字设置)。