客户端使用GenuineChannels连接服务器(我们正在考虑切换到DotNetRemoting)。通过“查找”,我的意思是获取要连接的服务器的IP和端口号。
暴力破解似乎是一种方法,可以尝试网络上的每个IP并尝试活动端口(甚至不确定是否可能),但必须有更好的方法。
客户端使用GenuineChannels连接服务器(我们正在考虑切换到DotNetRemoting)。通过“查找”,我的意思是获取要连接的服务器的IP和端口号。
暴力破解似乎是一种方法,可以尝试网络上的每个IP并尝试活动端口(甚至不确定是否可能),但必须有更好的方法。
考虑广播特定的UDP数据包。当服务器看到广播的UDP数据包时,它们会发送回复。客户端可以从所有服务器收集回复,然后开始连接它们或者基于选举算法进行连接。
请参考以下客户端示例(未经测试的代码):
using System.Net;
using System.Net.Sockets;
[STAThread]
static void Main(string[] args)
{
Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Any, 8002));
socket.Connect(new IPEndPoint(IPAddress.Broadcast, 8001));
socket.Send(System.Text.ASCIIEncoding.ASCII.GetBytes("hello"));
int availableBytes = socket.Available;
if (availableBytes > 0)
{
byte[] buffer = new byte[availableBytes];
socket.Receive(buffer, 0, availableBytes, SocketFlags.None);
// buffer has the information on how to connect to the server
}
}
我认为在C#中使用Bonjour/Zeroconf/mDNS是最好的方法;这方面考虑得非常周到,使它能够良好地与网络协作。例如,如果可能的话,它会随着时间的推移降低ping的频率等。有一个叫做Mono.Zeroconf的库,而且我看到在Apple SDK中还有一个旧的.NET项目,但我没有找到它。
所以最简单的方法是安装Bonjour for Windows,然后获取Windows Binaries for Mono.Zeroconf,尝试例子MZClient.exe
,将Mono.Zeroconf.dll
和/或Mono.Zeroconf.Providers.Bonjour.dll
添加到您的项目引用中并运行。
像这样:
var service = new Mono.Zeroconf.RegisterService {
Name = "Use Me for Stuff",
RegType = "_daap._tcp",
ReplyDomain = "local.",
Port = 0024200,
TxtRecord = new Mono.Zeroconf.TxtRecord {
{"I have no idea what's going on", "true"}}
};
service.Register();
var browser = new Mono.Zeroconf.ServiceBrowser();
browser.ServiceAdded +=
delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) {
Console.WriteLine("Found Service: {0}", args.Service.Name);
args.Service.Resolved +=
delegate(object o, Mono.Zeroconf.ServiceBrowseEventArgs args) {
var s = args.Service;
Console.WriteLine(
"Resolved Service: {0} - {1}:{2} ({3} TXT record entries)",
s.FullName, s.HostEntry.AddressList[0], s.Port, s.TxtRecord.Count);
};
args.Service.Resolve();
};
browser.Browse("_daap._tcp", "local");
我想提供一个替代Zeroconf NuGet软件包的方案:Zeroconf。它没有任何本地依赖,所以你不需要安装Bonjour for Windows或其他任何东西。
它支持.NET 4.5、WP8和Win8。
WS-Discovery是一种旨在实现此目的的协议。它有几个不同的变体,不同的广播和代理方式。http://en.wikipedia.org/wiki/WS-Discovery
.NET WCF4实现了这个协议。
让服务器在网络上的特定端口监听广播(必须使用UDP)。当客户端启动时,在该端口上广播一些“ping”请求。当服务器看到“ping”时,它将发送一个消息,其中包含客户端连接所需的TCP地址和端口。