我正在尝试构建一个网络应用程序。我已经成功地制作了一个发送和接收包的服务器。到目前为止,已经在一台指向 127.0.0.1 的计算机上完成了测试(没有像家这样的地方)。现在我想切换到网络。如何在 LAN 网络上找到正在侦听我的特定端口的计算机?
问问题
3058 次
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
。我们有两台服务器,Server1
在192.168.1.2
服务监听端口1234
,Server2
在服务192.168.1.3
端口4567
。两者都在端口上列出3000
广播消息。连接的客户端将在 IP192.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 消息。他解析回复并向用户显示可连接的两台服务器。
于 2012-10-27T21:26:08.473 回答