2012-10-27 32 views
5

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

+0

给出该机器的ip而不是127.0.0.1 – Adil

+0

你只关心子网或者你想检查可能在其他子网中的计算机吗? –

+0

是的,但我的问题是找到实际的端口。这样我就可以使用它,而不用硬编码IP的 – Samyn

回答

4

该服务将需要监听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的子网。我们有两台服务器,Server1192.168.1.2服务侦听端口1234Server2192.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消息。他解析答复并向用户显示可用于连接的两台服务器。