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

7

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


1
看一下nmap如何工作的说明可能会有所帮助。 - Victor Sorokin
4个回答

10

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

应用程序在启动时应该广播/多播其IP/端口信息。所有正在运行的实例都应该回应此消息并提供其IP/端口信息。这种发现机制易于实现,而且比端口扫描方法更快且更动态。


1

1

扫描端口是一个不好的选择,你很可能会触发网络中的防火墙,将你的机器显示为攻击者。网络上的任何入侵检测系统也可能被触发。这对于你所需的内容来说是很多的开销。

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

另一个选择是拥有一个集中式服务器,可以是Web服务器(php脚本、asp.net页面等)或Web服务(REST),聊天客户端在启动时连接到该服务器,POST其监听IP/端口,然后反过来接收网络上其他客户端最近公布的IP/端口列表。你可能需要一些保持活动的功能,例如:客户端每5分钟POST到页面一次,如果一个IP在10分钟内没有POST,则从列表中删除。

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

您只需要向其发送Web请求即可检索IP。如果您想获取本地接口的非0.0.0.0/127.0.0.1 IP,则可以查看以下帖子:

Get local IP address

How do I get the Local Network IP address of a computer programmatically? (C#)


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接