13

客户端使用 GenuineChannels 连接到服务器(我们正在考虑切换到 DotNetRemoting)。我所说的查找是获取要连接的服务器的 IP 和端口号。

似乎蛮力的方法是尝试网络上的每个 IP 尝试活动端口(甚至不确定这是否可能),但必须有更好的方法。

4

5 回答 5

12

考虑广播一个特定的 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
    }
}
于 2008-10-16T22:02:13.070 回答
10

我想说最好的方法是在 C# 中使用 Bonjour/Zeroconf/mDNS;为了让它与网络融为一体,我们花了很多心思;IE 如果可能的话,随着时间的推移,它的 ping 频率会降低,等等。有Mono.Zeroconf,我读到Apple SDK中有一个较旧的 .NET 项目,但我没有找到它。

所以最简单的方法是为 Windows 安装 Bonjour,然后为 Mono.Zeroconf 获取 Windows 二进制文件,尝试示例MZClient.exeMono.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");
于 2008-10-16T22:27:14.423 回答
5

只是想指出一个替代 Zeroconf NuGet 包:Zeroconf。它没有任何本机依赖项,​​因此您无需安装 Bonjour for Windows 或其他任何东西。

它支持 .NET 4.5、WP8 和 Win8。

于 2013-09-19T13:34:48.520 回答
3

WS-Discovery 是用于此目的的协议。它有一些不同的变体、不同风格的广播和代理。http://en.wikipedia.org/wiki/WS-Discovery

.NET WCF4 实现了这一点。

于 2011-03-03T11:09:38.847 回答
2

让服务器在网络上的特定端口上侦听广播(必须使用 UDP),当客户端启动时,它会在该端口上广播一些“ping”请求。当服务器看到“ping”时,它会发回一条消息,其中包含客户端连接到它所需的 TCP 地址和端口。

于 2008-10-16T22:01:33.773 回答