5

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

4

1 回答 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();
  }
}

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

对于此示例,假设我们有一个 IP192.168.1.0和子网为 的网络255.255.255.0。我们有两台服务器,Server1192.168.1.2服务监听端口1234Server2在服务192.168.1.3端口4567。两者都在端口上列出3000广播消息。连接的客户端将在 IP192.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 消息。他解析回复并向用户显示可连接的两台服务器。
于 2012-10-27T21:26:08.473 回答