2012-03-08 42 views
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 *作品可以帮助你描述。 – 2012-05-16 18:46:01

回答

9

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

在启动过程中,应用程序应广播/多播其IP /端口信息。所有正在运行的实例都应该使用其IP /端口信息来响应此消息。这种发现机制易于实现,运行速度更快,并且比端口扫描方法更具动态性。

+0

你能举一些例子吗? – rkmax 2012-05-17 22:40:20

1

扫描端口是一个糟糕的选择,您很可能会触发网络中的计算机上的防火墙将您的计算机显示为攻击者。网络上的任何入侵检测系统都可能被触发。这对于你所需要的很多开销。

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

广播另一种选择是有一个集中的服务器,或者是Web服务器(PHP脚本,asp.net页面,等上)或聊天客户端在启动时连接到的Web服务(REST),将其发送到监听IP /端口,然后将接收所有最近宣布的网络上其他客户端的IP /端口列表。您可能希望在这里保持活跃状态​​,IE:客户端会每隔5分钟向页面发布一次,如果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#)