チャット プログラムを作成していて (多くの人がそうしているように)、クライアントがサーバーに自動的に接続できるようにしたいと考えています。
ただし、サーバーのIPアドレスは永続的ではないため、プログラムにハードコアすることはできません
TCPでは、クライアントがサーバーの場所を知ることができる、ある種のブロードキャスト機能を探しています
何か案は?
編集:これはLANプログラムのみになると言ったはずです-外部接続はありません
チャット プログラムを作成していて (多くの人がそうしているように)、クライアントがサーバーに自動的に接続できるようにしたいと考えています。
ただし、サーバーのIPアドレスは永続的ではないため、プログラムにハードコアすることはできません
TCPでは、クライアントがサーバーの場所を知ることができる、ある種のブロードキャスト機能を探しています
何か案は?
編集:これはLANプログラムのみになると言ったはずです-外部接続はありません
LAN でのチャットについて話しているときに、何らかの理由で DNS を使用できない、または使用したくない場合は、UPnP で使用される検出プロトコルを実装するか、その実装を見つけることができます。SSDPは UDP ブロードキャストに基づいています。TCP にはセッションが必要なため、TCP 経由でマルチキャストすることはできません。
インターネット経由でチャット サーバーを使用する場合は、DNS を使用するしかありません。動的 DNS プロバイダーを探します (私は selfhost.bz を使用しています)。C# では、他の回答で説明されているように、ホスト名を IP アドレスに解決できます。ただし、接続するホスト名がある場合は、おそらくそれをソケットに渡すのに十分です。
socket.Connect("myhostname.selfhost.bz", ...
編集:あなたはLANにいると言っているので、SSDPの詳細をいくつか。プロトコルは、実際に必要以上に多くのことを行います。自分で実装することを考えている場合は、厳密に固執しないでください。指定したポートでクライアントにブロードキャストを送信させるだけです。サーバーは、メッセージを受信すると、そのポートを永続的にリッスンし、定義済みのメッセージで応答します。クライアントがその応答を受信すると、送信者が有効なサーバーであることがわかります。
DNS を使用します。アプリでホスト名を解決し、解決先の IP に接続します。IPは永続的ではないと言うので、動的DNSが必要になります。
私は考えました:サーバーにIPアドレス/ポート/その他を(パブリック)ネットワークのどこかにあるテキストファイルに書き込むだけで、クライアントはテキストファイルを読み取ることができます
明らかに、テキスト ファイルが存在しないか空の場合、サーバーは実行されていません...
これはそんなに悪い考えですか?
以下のプロセスを使用して、サーバーの IP アドレスを見つけます
public string GetIPAddress()
{
string strHostName = System.Net.Dns.GetHostName();
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
return ipAddress.ToString();
}
使用することもできます
Request.ServerVariables["LOCAL_ADDR"];