我目前正在使用C#中的一个小聊天工具 问题是我无法弄清楚如何扫描网络以查找所有计算机上的特定端口。我目前正在使用这种方法
IPGlobalProperties network = IPGlobalProperties.GetIPGlobalProperties();
IEnumerable<IPEndPoint> connections = network.GetActiveTcpListeners()
.Where(x => x.Port == ConstParams.iPort);
其中ConstParams.iPort
是我要扫描的端口(这里是6910)。
问题是返回的值只是本地端口和“0.0.0.0”ip地址......
如何扫描当前网络上的所有开放端口(6910)?
答案 0 :(得分:9)
我建议您实现基于多播/广播通信的简单发现机制,而不是使用端口扫描。
在启动期间,应用程序应广播/多播其IP /端口信息。所有正在运行的实例都应使用其IP /端口信息响应此消息。这种发现机制易于实现,并且在运行时更快,并且比端口扫描方法更具动态性。
答案 1 :(得分:1)
你应该考虑多播,而不是自己滚动,依赖现有的带有库支持的标准,比如mDNS: http://en.wikipedia.org/wiki/Multicast_DNS
或者,既然您说过C#,使用其原生解决方案之一: http://msdn.microsoft.com/en-us/library/system.net.peertopeer.aspx
答案 2 :(得分:1)
扫描端口是一个糟糕的选择,您很可能会在网络中的计算机上触发防火墙,将您的计算机显示为攻击者。网络上的任何入侵检测系统也可能被触发。你需要的是很多开销。
我建议使用UDP或多播进行广播以发现其他客户端 http://www.codeproject.com/Articles/1705/IP-Multicasting-in-C
另一种选择是在Web服务器(php脚本,asp.net页面等)或Web服务(REST)上建立一个集中式服务器,聊天客户端在启动时将连接到该服务器,POST它正在监听IP /端口,然后将接收网络上其他客户端的所有最近公布的IP /端口的列表。你可能想要一些在这里保持活着,IE:客户端会每5分钟POST一次页面,如果IP没有POST 10分钟,它将从列表中删除。
要获取本机的公共IP,您可以查看此页面: http://www.whatismyip.com/faq/automation.asp
您只需向其发送Web请求即可检索IP。如果你想获得本地界面的非0.0.0.0/127.0.0.1 IP,你可以查看这些帖子:
How do I get the Local Network IP address of a computer programmatically? (C#)
答案 3 :(得分:0)
GetIPGlobalProperties仅返回有关本地计算机的信息(请参阅http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.getipglobalproperties.aspx)。
要找出网络上哪些其他计算机打开了该端口,您必须遍历一系列IP,尝试在该端口上进行连接。没有中央存储库可以对此进行查询。
本文介绍了一种方法:http://www.dijksterhuis.org/building-a-simple-portscanner-in-c/