Javaプログラムで、ネットワーク上に同じIPアドレスが
存在していないかを確認したいとおもっています。

JavaではICMPレベルについてサポートしていないとのことで、
ネイティブのコマンドを利用しようと思い、以下のようにソースを書いてみました。

 try
 {
  // xxx.xxx.xxx.xxxはあるかどうか調べたいIPアドレス
  Process proc = Runtime.getRuntime().exec("ping xxx.xxx.xxx.xxx");
  proc.waitFor();
  int value = proc.exitValue();
  if(value == 0)
  {
   //正常
  }
  else
  {
   //異常終了
  }
 }
 cache(Exception e){}

IPアドレスが存在するときはproc.exitValue()の戻り値が0で、
存在しないときには0以外かと思ったのですが、
どうやらIPアドレスが存在はしていても、pingコマンドが正常に終了さえすれば
0が返ってきてしまうようです。

そこで戻りを一行ずつ読みこんで解析しようかとおもったのですが…、
どの文字が含まれていればネットワーク上に
IPアドレスxxx.xxx.xxx.xxxが含まれているかを判断できるのかがわかりません。

どのWindows上でも、IPアドレスの存在を確かめるには、どうしたらよいのでしょうか?

JavaというよりはWindows?の問題?かとおもったのですが、
Windows上でDOSから実行する分には、
人間が目視して確かめればいいだけだとおもうので、
プログラムが使用する場合にもつかえるpingコマンドを知りたいのです。
よろしくおねがいします。


使用JVM SDK1.3.1_02
使用OS Windows95,Windows98,Windows2000,WindowsMeすべてで共通に動かしたい

このQ&Aに関連する最新のQ&A

A 回答 (2件)

最近,javaからpingを投げることに頭を抱えてます.


この質問ってもう完了してしまったのでしょうか.
もし,情報ありましたらお願いいたします.

ちなみに僕の場合は
Process proc = Runtime.getRuntime().exec("ping xxx.xxx.xxx.xxx");
proc.waitFor(); ←ここで応答が来ません

Process proc = Runtime.getRuntime().exec("ping xxx.xxx.xxx.xxx > ping.log");
の場合は「Bad Parameter」とのメッセージが戻ってきています.

BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
br.readLine();
で戻ってきた内容を見ています.

よろしくお願いします
    • good
    • 0

PINGで応答がある場合。


C:\>ping 127.0.0.1

Pinging 127.0.0.1 with 32 bytes of data:

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms

C:\>
応答がない場合。
C:\>ping 1.1.1.1

Pinging 1.1.1.1 with 32 bytes of data:

Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 1.1.1.1:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
となります。
Runtime.getRuntime().exec("ping xxx.xxx.xxx.xxx > /tmp/ping.log");
等と記述して、ファイルの内容を見てはいかがですか。
Request timed uot.がpingで応答のなかった場合です。

この回答への補足

ありがとうございます。
お返事が遅れてごめんなさい。

えっと…。Request timed out.は
Windowsシステムすべてで共通といいきっていのでしょうか?
結果によって次の処理に自動的にふりわけたいのですが、
Request timed uot
をキーワードにすると、
ping 255.255.255.255とかのときには適応できないですよね…

補足日時:2002/04/10 08:16
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

Q{}の意味は

Javaでメソッドの宣言等ではなく、
{}
を書くと、どういう意味があるのでしょうか?

Aベストアンサー

ブロックですよね。
http://www.y-adagio.com/public/standards/tr_javalang/14.doc.htm#24644

ブロック内で宣言した変数はブロック外では参照できません。
たとえば、
public static void main(String[] arg){
{
int i = 0;
}
System.out.println(i); //コンパイルエラー
}
になります。

{}は普段のプログラミングでもよく使っていると思います。
if文やfor文などと一緒に。
if(true) {
//ここをifブロックと言ったりしますよね
}

Qreturn {c : c, h : h}について

私以外が作ったjavascriptプログラムでこのように書かれていました。

var h = null;
var c = null;
//省略
return {c : c, h : h}

このreturn文のところの意味を知りたいのです。
{x : x, y : y}という形式でプログラムすると、
どのような条件として判断されるのでしょうか?

このプログラムの意味が分かりませんでした。
もしよろしければ、教えて頂けませんか。
よろしくお願い致します。

Aベストアンサー

まず、Objectの表記方法はご存知ですか?
var o={a:1, b:2, c:"3"}
とかいう表記はObjectを表し、
alert(o.a)
という形で、プロパティを呼び出したり、という使い方があります。

なんてのは、「javascript オブジェクト初期化子」で検索していただくとして、


本題。
仕様上、functionは1個または0個の戻り値しか返せません。
  例:function f(){return 1;return 2;} はreturn 1が実行された時点で終了。
ですが、2個以上の戻り値が必要になることもあり、(人それぞれ?)
  例:角度を指定し、sin と cos の両方の値を返したい
    画像の縦と横のサイズを知りたい
そんなときに複数の値をプロパティとして持った一つのObjectにまとめてしまえば、
戻り値は一つですむ、という解決方法があったりします。(質問内容はこれにあたります)
配列で、なんていうのもあったり。


function f(t){return {s:Math.sin(t), c:Math.cos(t),t:Math.tan(t)}}
について、
var r=f(3.14)
alert(r.s)//sinの値を参照
alert(r.c)//cos
といったように使われます。私は使ったことないです。

独り言:あぁ、メモリの悲鳴が・・・

まず、Objectの表記方法はご存知ですか?
var o={a:1, b:2, c:"3"}
とかいう表記はObjectを表し、
alert(o.a)
という形で、プロパティを呼び出したり、という使い方があります。

なんてのは、「javascript オブジェクト初期化子」で検索していただくとして、


本題。
仕様上、functionは1個または0個の戻り値しか返せません。
  例:function f(){return 1;return 2;} はreturn 1が実行された時点で終了。
ですが、2個以上の戻り値が必要になることもあり、(人それぞれ?)
  例:角度を...続きを読む

Q中カッコ{}だけの記述について

いつもお世話になります。

以前あるソースコードを眺めていたら、中カッコ{}だけの記述をしているのを見かけました。
例えば、

public class Test {
public static void main(String args[]) {
{
String s = "ああああああああ";
System.out.println(s);
}
}
}

のような感じで、{から始まり何かの処理を書いて}で閉じるというようなもので、if文やfor文などなくいきなり中カッコで記述するというものです。
このような書き方ができるのは初めてしったのですが、このような書き方は何かの呼ばれ方があるのでしょうか、
またこのように書くことによって何かメリットはあるのでしょうか。

宜しくお願いします。

Aベストアンサー

> 書き方は何かの呼ばれ方があるのでしょうか、

単に「ブロック」もしくは「コードブロック」で良いと思います。


> またこのように書くことによって何かメリットはあるのでしょうか。

変数の有効範囲(スコープ)を限定する働きが有ります。

下記のコードはちゃんと動きますが、内側の{}を外してしまうと変数sが二重宣言となってしまうのでコンパイルエラーになります。

public class Test {

public static void main(String args[]) {

{
String s = "ああああああああ";
System.out.println(s);
}

{
String s = "いいいいいいいい";
System.out.println(s);
}
}
}


人気Q&Aランキング

おすすめ情報