如何扫描网络上等待连接的端口

本文关键字:连接 等待 网络 何扫描 扫描 | 更新日期: 2023-09-27 18:27:10

我目前正在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)?

如何扫描网络上等待连接的端口

我建议您实现一种基于多播/广播通信的简单发现机制,而不是使用端口扫描。

在启动期间,应用程序应广播/多播其IP/端口信息。所有正在运行的实例都应使用其IP/端口信息对此消息作出响应。这种发现机制很容易实现,而且它在运行时比端口扫描方法更快,也更动态。

您应该考虑多播,但不要自己滚动,而是依赖于具有库支持的现有标准,如mDNS:http://en.wikipedia.org/wiki/Multicast_DNS

或者,既然你说的是C#,就使用它的一个原生解决方案:http://msdn.microsoft.com/en-us/library/system.net.peertopeer.aspx

扫描端口是一个糟糕的选择,您很可能会在网络中的机器上触发防火墙,将您的机器显示为攻击者。网络上的任何入侵检测系统也可能被触发。对于你需要的东西来说,这是一大笔开销。

我建议使用UDP或多播进行广播以发现其他客户端http://www.codeproject.com/Articles/1705/IP-Multicasting-in-C

另一种选择是在网络服务器(php脚本、asp.net页面等)或网络服务(REST)上安装一个集中式服务器,聊天客户端将在启动时连接到该服务器,张贴其侦听的IP/端口,然后依次接收网络上其他客户端最近宣布的所有IP/端口的列表。你可能想要一些保持活跃的东西,IE:客户端每5分钟就会向页面POST一次,如果一个IP在10分钟内没有POST,它就会从列表中删除。

要获取机器的公共IP,您可以查看此页面:http://www.whatismyip.com/faq/automation.asp

您只需要向它发送一个web请求即可检索IP。如果你想获得本地接口的非0.0.0/127.0.0.1 IP,你可以查看以下帖子:

获取本地IP地址

如何以编程方式获取计算机的本地网络IP地址?(C#)

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/