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

时间:2012-10-27 21:11:13

标签: c# sockets port

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

1 个答案:

答案 0 :(得分:5)

该服务需要在已知端口上监听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();
  }
}

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

对于此示例,我们假设我们的网络的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. 客户端在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消息。他解析回复并向用户显示可用于连接的两个服务器。