- ベストアンサー
pingの結果を取得する方法
任意のホストにpingをうって、 返ってくるかこないかを考慮したプログラムを作りたいのですが、 こういうときにOSに既にあるpingを利用して結果を取得するということはできますか? それともpingの機能を自分で実装しなければなりませんか? 環境:FreeBSD 5.4 言語:C よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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; }
その他の回答 (2)
- mac_res
- ベストアンサー率36% (568/1571)
>ping自体にすぐに結果が返ってこない場合あきらめるというようなオプションはないようです。 -w waittime どのような場合でも関係なく、 ping を waittime 秒後に終了させる。 というものではだめでしょうか?
お礼
ありがとうございます。 調査不足でした。
- mac_res
- ベストアンサー率36% (568/1571)
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; }
補足
ちょっと補足で質問させてください。 このプログラムですと結果が返ってこないときにとまってしまうのですが何か対処法がありましたら教えてください。 ping自体にすぐに結果が返ってこない場合あきらめるというようなオプションはないようです。 二度目の質問で恐縮ですがよろしくお願いします。
お礼
ありがとうございます。 popenを使えばいいのですね。