dポイントプレゼントキャンペーン実施中!

任意のホストにpingをうって、
返ってくるかこないかを考慮したプログラムを作りたいのですが、
こういうときにOSに既にあるpingを利用して結果を取得するということはできますか?

それともpingの機能を自分で実装しなければなりませんか?

環境:FreeBSD 5.4
言語:C

よろしくお願いします。

A 回答 (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;
}
    • good
    • 1
この回答へのお礼

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

お礼日時:2005/12/17 19:53

>ping自体にすぐに結果が返ってこない場合あきらめるというようなオプションはないようです。



-w waittime
どのような場合でも関係なく、 ping を waittime 秒後に終了させる。
というものではだめでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/12/18 10:08

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自体にすぐに結果が返ってこない場合あきらめるというようなオプションはないようです。

二度目の質問で恐縮ですがよろしくお願いします。

補足日時:2005/12/17 20:10
    • good
    • 0

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