先日、仕事で私が書いたライブラリを使ったところ異常に時間がかかるという現象が起こったと報告を受けた。
そのライブラリはWinSockを使用して簡易的な通信をするためのライブラリであるのだが、調べてみると時間が掛かっている箇所は送信元のホスト名を調べる関数の中で起こっていることがわかった。以下のようなテストコードを書いて調べてみると、gethostbyaddr関数で数秒時間がかかる場合があることが判明。
そのライブラリはWinSockを使用して簡易的な通信をするためのライブラリであるのだが、調べてみると時間が掛かっている箇所は送信元のホスト名を調べる関数の中で起こっていることがわかった。以下のようなテストコードを書いて調べてみると、gethostbyaddr関数で数秒時間がかかる場合があることが判明。
main(int argc, char *argv[])
{
int i;
char ip[20];
DWORD t;
HOSTENT *h;
unsigned long addr;
WSADATA wsaData;
WSAStartup(0x0101, &wsaData);
strcpy(ip, argv[1]);
addr = inet_addr(ip);
printf("%s: ", ip);
t = GetTickCount();
if( ( h = gethostbyaddr((const char FAR *)&addr, 4, AF_INET)) != NULL )
printf("%s", h->h_name);
else
printf("(none)");
t = GetTickCount() - t;
printf(" %u msec\n", t);
WSACleanup();
}
IPアドレスを指定してホスト名解決にかかる時間を測定するものだが、キャッシュされるのか数十ミリ秒程度で済む場合もあれば、数秒かかる場合もある。一度解決すれば早い場合もあるし、何度も数秒かかる場合もある。hostsに書いてあれば早いこともわかった。
結局、仕事で書いたライブラリの方はhostsファイルに記述してもらって対応してもらった。
テーマ:プログラミング - ジャンル:コンピュータ
|
| ホーム |
SHOJI's Code



