selflearn @ ウィキ

Pingブロック図作成に向けて

最終更新:

selflearn

- view
メンバー限定 登録/ログイン

はじめに

pingのブロック図作成に向けて、コールグラフから呼ばれている関数を見てひっそりとメモをとっていきます。
まとまったら、ブロック図におこして、メインのページに掲載。

pingで呼ばれている関数


main()から呼ばれている関数


関数名:
ping_cvt_number()
ファイル名:
ping\ping_common.c
メモ:
コマンドオプション -c で与えられた引数が正常化チェックする。



関数名:
ping_init()
ファイル名:
libicmp\libping.c
メモ:
ソケットの作成
fd = socket (AF_INET, SOCK_RAW, proto->p_proto);

PING構造体を初期化して返す。
作成したソケットは、このPING構造体のメンバping_fdに格納



関数名:
ping_set_sockopt()
ファイル名:
libicmp\libping.c
メモ:
ブロードキャストパケットを送信できるように setsockopt() で
SO_BROADCAST を設定している。



関数名:
ping_set_count()
ファイル名:
libicmp\libping.c
メモ:
PING構造体のメンバping_countにechoパケットの送信回数を設定。
ping->ping_count = count;



関数名:
init_data_buffer()
ファイル名:
ping\ping_common.c
メモ:
グローバル変数data_bufferをアロケートして初期化する。
pingのオプション-pでパターンが指定されていた場合は、そのパターン
で初期化する。
指定されていなければ、data_bufferの配列を0から順番に値を入れている。
data_bufferは unsigned char *data_buffer; なのに以下のとおり int で
初期化しているのが謎。

for (i = 0; i < data_length; i++)
data_buffer[i] = i;



関数名:
ping_echo()
ファイル名:
ping\ping_echo.c
メモ:
pingのタイプ(ICMP_ECHO)、パケットサイズをセットする関数
ping_set_type()、ping_set_packetsize()をコールし、ping_set_event_handler()
イベントハンドラーに設定している。
そしてping_set_dest()で宛先を設定して、最後にping_run()をコール



ping_echo()から呼ばれている関数


関数名:
ping_set_type()
ファイル名:
libicmp\libping.c
メモ:
処理は以下の1行。
p->ping_type = type;
PING構造体のping_typeメンバにタイプ(ICMP_ECHO)を設定



関数名:
ping_set_packetsize()
ファイル名:
libicmp\libping.c
メモ:
処理は以下の1行
ping->ping_datalen = size;
PING構造体のping_datalenにサイズを設定



関数名:
ping_set_event_handler()
ファイル名:
libicmp\libping.c
メモ:
処理は以下の2行
ping_set_event_handler (PING *ping, ping_efp pf, void *closure)
{
 ping->ping_event = pf;
 ping->ping_closure = closure;
}
第2引数は関数ポインタ。ping_efpっという型が謎。
第3引数はping_statという構造体。統計情報が保存されるっぽい。
呼び出し側からは、ping_stat.tmin = 999999999.0;で初期化されているだけ。



関数名:
ping_set_destination()
ファイル名:
libicmp\libping.c
メモ:
PING構造体のメンバping_hostnameに宛先を設定している。



関数名:
ping_run()
ファイル名:
ping\ping.c
メモ:
第1引数にはPING構造体、第2引数には関数ポインタecho_finish()が
格納された呼ばれる。
send_echo()でECHOリクエストを送って、select()でパケットの到着を待つ。
パケットが到着した場合は、ping_recv()で受信。
ping_run()の最後に引数で指定された関数ポインタecho_finish()をコール
記事メニュー
人気記事ランキング
目安箱バナー