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

5
我正在尝试构建一个网络应用程序。我已经成功地创建了一个发送和接收数据包的服务器。到目前为止,测试是在指向127.0.0.1(没有比家更好的地方)的一台计算机上进行的。现在我想转移到网络上。如何找到正在监听我特定端口的局域网中的计算机?

请提供该机器的IP地址,而不是127.0.0.1。 - Adil
你只关心特定子网吗?还是想检查其他子网中可能存在的可用计算机? - Scott Chamberlain
是的,但我的问题是找到实际的端口。这样我就可以在不硬编码IP的情况下使用它。 - requinard
@ScottChamberlain 只有一个子网。 - requinard
将您的服务器绑定到地址0.0.0.0(仅限IPv4),以覆盖所有接口。 - ott--
1个回答

5
该服务需要在已知端口上监听广播消息(如果您想表现得非常好,可以向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();
  }
}

作为一个伪例子,以下是我如何执行的事件序列。
对于这个例子,假设我们有一个IP为192.168.1.0、子网掩码为255.255.255.0的网络。我们有两台服务器,Server1在192.168.1.2上,服务监听端口为1234;Server2在192.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消息。他解析回复并向用户显示可连接的两个服务器。

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