• ベストアンサー

pingの結果を取得する方法

任意のホストにpingをうって、 返ってくるかこないかを考慮したプログラムを作りたいのですが、 こういうときにOSに既にあるpingを利用して結果を取得するということはできますか? それともpingの機能を自分で実装しなければなりませんか? 環境:FreeBSD 5.4 言語:C よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.1

ping(3)のソースを改造してもそう難しくはありませんが、下記の方法でpingを実行した結果を取得できます。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include <stdio.h> #include <stdlib.h> #include <errno.h> char *prog; int main(int argc, char *argv[]) { FILE *Pping; char cmd[BUFSIZ], buf[BUFSIZ]; prog = argv[0]; if (argc < 2) { fprintf (stderr, "Usage: %s hostname\n", prog); exit(EINVAL); } snprintf(cmd, BUFSIZ, "ping -c 1 %s", argv[1]); if ((Pping = popen(cmd, "r")) == NULL) { fprintf(stderr, "Can't exec \"%s\"\n", cmd); exit(errno); } fgets(buf, BUFSIZ, Pping); fgets(buf, BUFSIZ, Pping); printf("%s", buf); return 0; }

nicname
質問者

お礼

ありがとうございます。 popenを使えばいいのですね。

その他の回答 (2)

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.3

>ping自体にすぐに結果が返ってこない場合あきらめるというようなオプションはないようです。 -w waittime どのような場合でも関係なく、 ping を waittime 秒後に終了させる。 というものではだめでしょうか?

nicname
質問者

お礼

ありがとうございます。 調査不足でした。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

pingのエラーに対処できるよう標準エラー出力もパイプで受け取ったほうが良かったですね。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include <stdio.h> #include <stdlib.h> #include <errno.h> char *prog; int main(int argc, char *argv[]) { FILE *Pping; char cmd[BUFSIZ], buf[BUFSIZ]; prog = argv[0]; if (argc < 2) { fprintf (stderr, "Usage: %s hostname\n", prog); exit(EINVAL); } snprintf(cmd, BUFSIZ, "ping -c 1 %s 2>&1", argv[1]); if ((Pping = popen(cmd, "r")) == NULL) { fprintf(stderr, "Can't exec \"%s\"\n", cmd); exit(errno); } fgets(buf, BUFSIZ, Pping); printf("ret1 = %s", buf); fgets(buf, BUFSIZ, Pping); printf("ret2 = %s", buf); pclose(Pping); return 0; }

nicname
質問者

補足

ちょっと補足で質問させてください。 このプログラムですと結果が返ってこないときにとまってしまうのですが何か対処法がありましたら教えてください。 ping自体にすぐに結果が返ってこない場合あきらめるというようなオプションはないようです。 二度目の質問で恐縮ですがよろしくお願いします。

関連するQ&A