在网络中查找打开的TCP端口
我正在尝试构建一个netowrk应用程序。 我成功地制作了一个发送和接收包的服务器。 到目前为止,测试已在一台指向127.0.0.1的计算机上完成(没有像家一样的地方)。 现在我想切换到网络。 如何在LAN网络上找到正在侦听我的特定端口的计算机?
该服务需要在已知端口上侦听广播消息 (如果您希望表现得非常好,可以向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
- 客户端在动态端口范围 (49152-65535)中选择一个随机端口,并在UDP(本例中为端口50123)上绑定它并监听。
- 客户端使用他正在监听的相同端口广播到其本地子网(
192.168.1.255:3000
)的广播地址和已知端口。 他发送某种有效负载,因此服务器只发回给您的客户,而不是碰巧使用与您相同的端口的其他人。 (让我们说它发送字符串Send me your info for XYZ app!
) - Server1接收广播。 检查消息是否
Send me your info for XYZ app!
并发送UDP消息Name:Server1 IP:192.168.1.2 Port:1234
返回发件人源端口和IP组合(192.168.1.4:50123
) - Server2也接收广播。 检查消息是否
Send me your info for XYZ app!
并发送UDP消息Name:Server2 IP:192.168.1.3 Port:4567
消息返回发件人源端口和IP组合(192.168.1.4:50123
) - 客户端在发送消息的同一端口上收到两条UDP消息。 他解析回复并向用户显示可用于连接的两个服务器。