クライアントアプリがC#でローカルネットワーク上のサーバーを見つける最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/210446

質問

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

ブルートフォースのアプローチでは、ネットワーク上のすべてのIPがアクティブポートを試行するように見えます(それが可能かどうかはわかりません)が、より良い方法が必要です。

役に立ちましたか?

解決

特定の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
    }
}

他のヒント

最善の方法は、C#にBonjour / Zeroconf / mDNSを使用することです。ネットワークでうまく動作させるために、多くの検討が行われました。 IE可能な場合は、時間の経過とともにpingの頻度が減ります。 Mono.Zeroconf があります。 Apple SDK にある古い.NETプロジェクトが見つかりませんでした。

したがって、最も簡単なのは、 Bonjour for Windows をインストールしてから、< a href = "http://download.banshee-project.org/mono-zeroconf/mono-zeroconf-0.8.0-binary.zip" rel = "noreferrer"> Mono.ZeroconfのWindowsバイナリを試してください例 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アドレスとポートを含むメッセージを送り返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top