在网络中查找打开的TCP端口

我正在尝试构建一个netowrk应用程序。 我成功地制作了一个发送和接收包的服务器。 到目前为止,测试已在一台指向127.0.0.1的计算机上完成(没有像家一样的地方)。 现在我想切换到网络。 如何在LAN网络上找到正在侦听我的特定端口的计算机?

该服务需要在已知端口上侦听广播消息 (如果您希望表现得非常好,可以向IANA注册该程序和端口号 ),当它听到广播消息时,它会向发送方回复服务器的IP和服务正在侦听传入连接的端口。

以下是上面链接中的一个简单示例,它只是打印到连接的控制台和端口,但您可以使用此信息在两个端点之间建立TCP或UDP连接。

using System; using System.Net; using System.Net.Sockets; using System.Text; class RecvBroadcst { public static void Main() { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); sock.Bind(iep); EndPoint ep = (EndPoint)iep; Console.WriteLine("Ready to receive…"); byte[] data = new byte[1024]; int recv = sock.ReceiveFrom(data, ref ep); string stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()); data = new byte[1024]; recv = sock.ReceiveFrom(data, ref ep); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()); sock.Close(); } } 

作为一个psudo示例,这里是我将如何做的事件序列。

对于这个例子,假设我们的网络IP为192.168.1.0 ,子网为255.255.255.0 。 我们有两台服务器, Server1192.168.1.2 ,服务监听端口1234Server2192.168.1.3 ,服务端口为4567 。 两者都在端口3000上列出广播消息。 客户端连接将在IP 192.168.1.4

  1. 客户端在动态端口范围 (49152-65535)中选择一个随机端口,并在UDP(本例中为端口50123)上绑定它并监听。
  2. 客户端使用他正在监听的相同端口广播到其本地子网( 192.168.1.255:3000 )的广播地址和已知端口。 他发送某种有效负载,因此服务器只发回给您的客户,而不是碰巧使用与您相同的端口的其他人。 (让我们说它发送字符串Send me your info for XYZ app!
  3. Server1接收广播。 检查消息是否Send me your info for XYZ app! 并发送UDP消息Name:Server1 IP:192.168.1.2 Port:1234返回发件人源端口和IP组合( 192.168.1.4:50123
  4. Server2也接收广播。 检查消息是否Send me your info for XYZ app! 并发送UDP消息Name:Server2 IP:192.168.1.3 Port:4567消息返回发件人源端口和IP组合( 192.168.1.4:50123
  5. 客户端在发送消息的同一端口上收到两条UDP消息。 他解析回复并向用户显示可用于连接的两个服务器。