13

クライアントは、GenuineChannels を使用してサーバーに接続します (DotNetRemoting への切り替えを検討しています)。find とは、接続するサーバーの IP とポート番号を取得することです。

ネットワーク上のすべての IP を試してアクティブなポートを試すという総当りのアプローチのように思えますが (それが可能かどうかもわかりません)、もっと良い方法があるはずです。

4

5 に答える 5

12

特定の UDP パケットをブロードキャストすることを検討してください。1 つまたは複数のサーバーがブロードキャストされた 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 プロジェクトがあることを読みましたが、見つかりませんでした。

Bonjour for Windowsをインストールし、Mono.Zeroconf の Windows Binaries を取得して、プロジェクト参照にand/orをMZClient.exeドロップして実行するのが最も簡単です。Mono.Zeroconf.dllMono.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

.NETWCF4はこれを実装します。

于 2011-03-03T11:09:38.847 に答える
2

サーバーにネットワーク上の特定のポートでブロードキャストをリッスンさせます (UDP を使用する必要があります)。クライアントの起動時に、そのポートで "ping" 要求をブロードキャストします。サーバーは「ping」を確認すると、クライアントが接続するために必要な TCP アドレスとポートを含むメッセージを送り返します。

于 2008-10-16T22:01:33.773 に答える