- PR -

IPアドレスキャッシュの無効化

1
投稿者投稿内容
peto
会議室デビュー日: 2003/06/02
投稿数: 3
投稿日時: 2003-06-02 18:00
こんにちは、はじめて投稿させていただきます。

java.net.InetAddress.getLocalHost()を使用した際、最初に取得した
ローカルIPアドレスがキャッシュされますが、これを無効化する方法を
調べています。

JDK1.4で開発を行う場合には、java.net.networkaddress.cache.ttl
プロパティを0とすることで無効化できることがわかりましたが、MS-SDK
for Java4.0でこれと同じようなやりかたがわかりません。

有識者がいらっしゃいましたら教えていただけませんでしょうか。
あるいはヒントとなるような情報が掲載されているサイトを教えていただ
けませんでしょうか。

よろしくお願いします。
呂布
会議室デビュー日: 2003/03/07
投稿数: 16
お住まい・勤務地: Tokyo
投稿日時: 2003-06-05 00:07
うう、MS-SDK持ってないのでpetoさんのお力になれそうもないっす。MS-SDK for Java4.0って、存在からしてなんだか信頼の置けない開発環境ですね…

でもSunのJavaに準拠した環境なのにjava.net.networkaddress.cache.ttlプロパティを変えて同じように動作しないのであれば、APIがキャッシュしているんではなくてリゾルバがキャッシュしてしまっているのかもしれませんね。
1.リゾルバのキャッシュをクリアする。
> ipconfig /flushdns
2.getLocalHostを実行。
3.リゾルバのキャッシュを覗いてみる。
> ipconfig /displaydns
どうでやんすか。
peto
会議室デビュー日: 2003/06/02
投稿数: 3
投稿日時: 2003-06-05 09:50
コメントありがとうございます。

引用:
MS-SDK for Java4.0って、存在からしてなんだか信頼の置けない開発環境ですね…



私としてもよくわからないMS-SDKで開発したくはないんですが、無料で手に入ることと
MS-JVMで実行できるAppletを作る必要があるため、仕方なく使っています(^^;
MS-JVMで動作し、かつ今回質問されていただいた事項をクリアできるAppletを作ること
ができるのであれば、他の開発環境でも全然構わないのですが…。

さて、呂布さんに指摘していただいた通り、リゾルバキャッシュの可能性について確認
してみました。結果としては、残念ながらNG。J2SDK1.4で開発したAppletを使い、同
環境で動作確認してみましたが、こちらは問題ありませんので、やはりAPIによるキャ
ッシュということで間違いなさそうです。

最初の投稿では書きませんでしたが、今回作ろうとしているAppletは、ローカルマシン
のIPアドレスを定期的に表示するものです。ここで、ローカルマシンは接続しているネ
ットワークを次々と移動するという仮定付きでして、最初にInetAddressクラスで取得
したIPアドレスをキャッシュされてしまうと目的が実現できないため、困って質問させ
ていただいたというわけです。
werdna
会議室デビュー日: 2003/06/05
投稿数: 2
投稿日時: 2003-06-05 11:05
自分もMS-SDKはわからないのですが…
参考までに…

引用:

さて、呂布さんに指摘していただいた通り、リゾルバキャッシュの可能性について確認
してみました。結果としては、残念ながらNG。J2SDK1.4で開発したAppletを使い、同
環境で動作確認してみましたが、こちらは問題ありませんので、やはりAPIによるキャ
ッシュということで間違いなさそうです。



SunのJavaVMではInetAddressがstaticな領域にキャッシュします。
JDK1.3.xでも1.4.xでも同じです。

引用:

最初の投稿では書きませんでしたが、今回作ろうとしているAppletは、ローカルマシン
のIPアドレスを定期的に表示するものです。ここで、ローカルマシンは接続しているネ
ットワークを次々と移動するという仮定付きでして、最初にInetAddressクラスで取得
したIPアドレスをキャッシュされてしまうと目的が実現できないため、困って質問させ
ていただいたというわけです。



JDK1.4では java.net.networkaddress.cache.ttl でキャッシュの制御ができますが、
JDK1.3にはありません。
そのかわりJavaのプロパティとして -Dsun.net.inetaddr.ttl があります。
これでキャッシュを破棄できるようですが、Windwos2000では正常に動かないと言ったBugが
あった気がします。

MS-SDKにも同じようなパラメータがあるかもしれませんが、ちょっと調べたところわかりませんでした。

役立たずですいません…
呂布
会議室デビュー日: 2003/03/07
投稿数: 16
お住まい・勤務地: Tokyo
投稿日時: 2003-06-05 12:41
werdnaさんどうもありがとうございます。

ResourceBundleのキャッシュなどでもpetoさん同様の問題があります。次の手を試してみてはどうでしょう。

Object o = java.net.InetAddress.getLocalHost();
o = null; // 消えろ!
System.out.println(java.net.InetAddress.getLocalHost());

単純な手段ですが。java.net.InetAddress.getLocalHost()のところ、java.net.InetAddress.getAllByName(localhostName) でも試してみてね。

それはそうと、MS-SDK for Java 4.0 で試してみようと思って随分探したんですが、Microsoftのサイトからは発見できませんでした。消えた…
peto
会議室デビュー日: 2003/06/02
投稿数: 3
投稿日時: 2003-06-05 16:38
werdnaさん、呂布さん、ありがとうございます。

引用:
MS-SDKにも同じようなパラメータがあるかもしれませんが、ちょっと調べたところわかりませんでした。


わざわざ調べていただいて恐縮です。
私もけっこう調べてはいるんですが、手がかりなしです…。

引用:
ResourceBundleのキャッシュなどでもpetoさん同様の問題があります。次の手を試してみてはどうでしょう。

Object o = java.net.InetAddress.getLocalHost();
o = null; // 消えろ!
System.out.println(java.net.InetAddress.getLocalHost());

単純な手段ですが。java.net.InetAddress.getLocalHost()のところ、java.net.InetAddress.getAllByName(localhostName) でも試してみてね。


早速試させていただきましたが、NGでした。
やはりキャッシュ制御しか方法がないのでしょうか。

引用:
それはそうと、MS-SDK for Java 4.0 で試してみようと思って随分探したんですが、Microsoftのサイトからは発見できませんでした。消えた…


うーむ、確かになくなってますね。
もうMS-SDKは使うなと示唆しているように思えますね…。
1

スキルアップ/キャリアアップ(JOB@IT)