C# で LAN メッセンジャーを作成するには、明らかに同じ LAN メッセンジャー ソフトウェアを使用してオンラインでホスト コンピューターを検出する必要があります。そのための出発点を探してみましたが、無駄でした。仕事を始める方法を知る必要があります。
7 に答える
過去にこれを行った方法は 2 つあります。すべてのクライアントを定義済みのホストに接続する方法 (簡単ですが、クライアントの構成が必要です) と、ホスト (またはクライアント) が「ブロードキャスト」アドレスを介してその存在をブロードキャストする方法 (例: 、10.0.255.255) (ハード、ファイアウォール/NAT は人生を苦痛にする可能性があります。クライアントは構成を必要としません)。
しかし、そうです。WCF が検出プロトコルを実装している場合は、それを使用してください。それがあなたが望むものであれば、それはおそらくあなたが(あるいはほとんどの人が)書くことができるものよりも優れています.
LAN Messenger で使用したこの GetComputers() メソッドを使用します
using System.Diagnostics;
public static string[] GetComputers()
{
//Process that retrieves the net view >> list of computers on the network
Process proc = new Process();
proc.StartInfo.FileName = "net.exe";
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.Arguments = "view";
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
//Reads the output of the net view.
StreamReader sr = new StreamReader(proc.StandardOutput.BaseStream);
string line = "";
List<string> names = new List<string>();
while ((line = sr.ReadLine()) != null)
{
if (line.StartsWith(@"\\"))
names.Add(line.Substring(2).Split(' ')[0].TrimEnd());
}
sr.Close();
proc.WaitForExit();
//Array that contains computer names
string[] computerNames = new string[names.Capacity];
int i = 1;
//Adds computers names to the list view
foreach (string name in names)
{
computerNames[i] = name;
i++;
}
return computerNames;
}
Windows Connection Foundation を使用できますか? その場合、WCF を使用して WS-Discovery プロトコルを実装できます。簡単なハウツーを次に示します。
集中型サーバーに依存するかどうかに応じて、次のオプションがあります。
1) サーバーなし: クライアントがオンラインになると、クライアントはその ID をブロードキャストし、他のクライアントに自分の ID を送信するように求めます。
2) 集中型サーバー: 新しいクライアントが接続し、サーバーに登録してクライアントのリストをダウンロードします。次に、各クライアントに (ポーリング、WCF を使用している場合は二重コントラクト、または基本的なソケット接続を介して) 新しいクライアントが通知されます。
最初のバージョンは、UDP ソケットに基づいています。これらのパケットはルーターを通過しないと思われるため、これはローカル ネットワークからは機能しないことに注意してください。また、多数のクライアントがネットワークをパケットで圧倒するだけなので、これはおそらく悪い設計です。でもねえ、それはあなたにとって十分かもしれません。
また、WCF にはピア ツー ピアのサポートがあります。興味深いかもしれません。それに関する記事はこちらです。
Bonjour、Rendevous、または場合によっては Avahi とも呼ばれる ZeroConf を使用することをお勧めします。
アプリケーションが事前定義されたポートでリッスンし、誰かがそのポートに接続すると、アプリケーション名や IP などの何らかの確認応答を返すことができます。
そのため、新しいクライアントがオンラインになると、IP をアドバタイズする UDP パケットをブロードキャストで送信します。他のクライアントは、関連するポートでこれらの「アナウンス」をリッスンし、送信者に独自の IP を (他のポートを介して) 送り返します。これで、最初の送信者は、LAN 上で実行中のすべてのクライアントから IP で連絡を受けるようになります。他のクライアントは、「アナウンスメント」の送信者の IP を記録することもできます。これにより、ネットワーク上の他のクライアントのリストも最新の状態に保つことができます。
リストを最新の状態に保つために、すべてのクライアントにネットワーク上での存在を半ランダムな間隔 (たとえば、毎分 + rand(10) 秒) でブロードキャストさせることができます。
上記はすべて、同じネットワーク上のクライアントについて話していることを前提としています。これをインターネット上で行う場合、ログインしているクライアントの IP を追跡する中心点が必要になります。
ブロードキャスト IP に ping を実行して、全員から回答を得ることができると思います。またはそのようなもの。それから始めて、クライアントが何らかのポートでリッスンしているかどうかを確認できます。
別の方法として、クライアントがサーバーに「私たちはまだここにいます!」と伝えるようにすることもできます。時々。