该服务需要监听广播消息在一个已知的端口上(如果你想表现得非常好,你可以向 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();
}
}
作为一个伪示例,这里是我将如何做到这一点的事件顺序。
对于这个例子,假设我们有一个 IP 为192.168.1.0
和一个子网255.255.255.0
。我们有两台服务器,Server1
at 192.168.1.2
服务在端口上监听1234
, and Server2
at 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 消息。他解析回复并向用户显示可连接的两个服务器。