【问题标题】:Finding open TCP port in a network在网络中查找打开的 TCP 端口
【发布时间】:2012-10-17 17:45:04
【问题描述】:

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

【问题讨论】:

  • 给出那台机器的 ip 而不是 127.0.0.1
  • 您是只关心所在子网还是要检查其他子网中的可用计算机?
  • 是的,但我的问题是找到实际的端口。这样我就可以使用它而无需对 IP 进行硬编码
  • @ScottChamberlain 只有一个子网
  • 将您的服务器绑定到所有接口的地址 0.0.0.0(仅限 ipv4)。

标签: c# sockets port


【解决方案1】:

该服务将需要在已知端口上侦听broadcast messages(如果您想表现得非常好,您可以register the program and port number with the 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 的子网。我们有两台服务器,Server1192.168.1.2 服务监听端口1234,Server2192.168.1.3 服务端口为4567。两者都在端口3000 上列出广播消息。连接的客户端将在 IP 192.168.1.4

  1. 客户端在dynamic port range(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 消息。他解析回复并向用户显示可连接的两台服务器。

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 2013-05-12
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多