0

サーバーにパケットを送信するために UdpClient を使用しています。(ホスト名、ポート) コンストラクターを使用して、Sender オブジェクトの構築時に UdpClient を初期化しています。この方法で構築されると、UdpClient はホスト名を IP アドレスに解決します。UdpClient オブジェクトへの後続の呼び出しでは、IP アドレスが使用されます。

残念ながら、使用されている DNS エイリアスが DNS システムを介して別の IP アドレスを指すように更新された場合、この変更は Sender オブジェクトを再作成しない限り反映されません。

Sender オブジェクトを DNS の変更にタイムリーに反応させる最善の方法は何ですか? パフォーマンスは非常に重要です。私はいくつかの解決策を考えることができます:

  1. すべての呼び出しで DNS 解決を実行します (つまり、ホスト名パラメーターを受け入れる Send オーバーロードを使用します)。Windows DNS キャッシュのおかげで、これは実際には非常に高速である可能性がありますが、わかりません。
  2. DNSエイリアスが別のIPに解決されるかどうかを定期的にチェックするために、タイマースレッドである種のDNSチェッカーを実行します。その場合、何らかの方法で UdpClient を更新して、新しい IP アドレスを使用します。ただし、すべての呼び出しで UdpClient オブジェクトをロックしたくはありません。前述のとおり、パフォーマンスは重要です。

誰でもこれを行った経験がありますか?

4

1 に答える 1

2

アドレス解決はUdpClient.

  1. Dnsクラスを使用して解決 IPaddress(およびローカル変数に格納)
  2. のパラメーターなしのコンストラクターを使用しますUdpClient
  3. 接続しないでくださいUdpClient
  4. パラメータで明示的に使用SendIPEndPointます。

バックグラウンド スレッドで:

  1. 更新された DNS を X 秒ごとに確認する
  2. IPEndPoint呼び出しに渡すローカル変数を置き換えますUdpClient.Send

UdpClientこれを行うたびにあなたを破壊する必要はありません。また、更新時にロックする必要はありませんIPEndPoint。最悪のケースは、古いアドレスにダーティーな送信が 1 つある場合ですが、更新がすぐに通知されないため、いずれにせよダーティーな送信が発生することになります。

于 2009-04-28T13:29:21.003 に答える