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

Sam*_*myn 5 c# sockets port

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

Sco*_*ain 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

对于这个例子,假设我们有一个IP为IP 192.168.1.0且子网为的网络255.255.255.0.我们有两台服务器,Server1192.168.1.2与服务侦听端口1234,并Server2192.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消息.他解析回复并向用户显示可用于连接的两个服务器.