Erlangにおけるdns解析


ecrawlerのため、DNS解析機能を持つ必要がありますが、システムが提供するgethostbynameのような関数の内部実装メカニズムに注意するには、順序で実行するか、複数の接続の同時実行を開始するかを紹介しています.
私はerlangでテストをしました(windows 2003+R 12 B-3):
1,まずローカルdns情報(cmdにおけるipconfig/flushdns)をクリアする
2,複数のprocessがinet:getaddr/2要求dnsアドレスを同時に呼び出す
3,wiresharkはパケットをつかんで、同時に4つのDNS(port 53)の要求しかないことを発見して、4つのdnsの要求が成功した後に、1つ目はまた1回の要求を行って、結果は私の5つの要求だけが解析に成功して、その他はすべて{error,timeout}です
このようにerlangのinet:getaddr/2は限られた数の接続をオンにしただけで,その後dns解析要求が行われ,後の余分な要求はタイムアウトするしかない.getaddrはもっと多くのオプションを提供するべきではありませんか?
テスト結果は次のとおりです.
%%  
<0.258.0> start:{1221,193358,78000} Host:"www.toquick.com"
<0.259.0> start:{1221,193358,78001} Host:"www.ubuntu.org"
<0.260.0> start:{1221,193358,78002} Host:"www.china.com"
<0.261.0> start:{1221,193358,78003} Host:"www.tom.com"
<0.262.0> start:{1221,193358,78004} Host:"www.sohu.com"
<0.263.0> start:{1221,193358,78005} Host:"www.msn.com"
<0.264.0> start:{1221,193358,78006} Host:"www.answers.com"
<0.265.0> start:{1221,193358,78007} Host:"www.tudou.com"
<0.266.0> start:{1221,193358,78008} Host:"www.erlang.org"
<0.267.0> start:{1221,193358,78009} Host:"www.howcast.com"
<0.268.0> start:{1221,193358,78010} Host:"www.go2map.com"
<0.269.0> start:{1221,193358,78011} Host:"www.microsoft.com"
%% response
<0.259.0> end:{1221,193358,78012} Value:{ok,{147,83,195,55}}
<0.260.0> end:{1221,193358,78013} Value:{ok,{221,194,139,22}}
<0.258.0> end:{1221,193358,78014} Value:{ok,{211,136,108,240}}
<0.261.0> end:{1221,193358,78015} Value:{ok,{202,108,12,68}}
<0.262.0> end:{1221,193358,78016} Value:{ok,{61,135,189,165}}
<0.269.0> end:{1221,193366,93000} Value:{error,timeout}
<0.268.0> end:{1221,193366,93001} Value:{error,timeout}
<0.267.0> end:{1221,193366,93002} Value:{error,timeout}
<0.266.0> end:{1221,193366,93003} Value:{error,timeout}
<0.265.0> end:{1221,193366,93004} Value:{error,timeout}
<0.264.0> end:{1221,193366,93005} Value:{error,timeout}
<0.263.0> end:{1221,193366,93006} Value:{error,timeout}

そしてyufengの助けに感謝します!
Erlangではnativeとerlang dnsリクエストが提供され,dns解析は2つの方法で行われる.ここでnative方式では、port呼び出し外部アプリケーションによって実現され、gethostbynameなどの外部アプリケーション呼び出しシステム自体のdns関連API;Erlang自身もdnsのリクエスト解析を実現し、キャッシュ、管理メカニズムを持っている.
参考:ERTS User's Guideの
inet configurationが構成される.
Erlangのデフォルトではnative方式でdns解析が行われ、デフォルトの同時数は4であるため、本論文の問題が発生し、複数のdns解析要求は、最初の4つだけが成功し、その他はタイムアウトした.変数を設定できます:gethost_poolsizeはコンカレント数を大きくします(1を大きくするたびに、外部アプリケーションが新しくスレッドを作成することに注意してください):
erl -kernel gethost_poolsize 12
erlangを起動し、同時要求数を12に設定し、testdns:dns()を実行してすべての要求に成功しました.
大量の同時dnsリクエストに対してnative方式では実行できないことは明らかです.そのため、erlang自身のdnsリクエストを採用し、プロファイル(erl_inetrc)を作成します.
%erl_inetrc
%% specify lookup method
{lookup, [dns]}.
%% timeout
{timeout, 5000}.
{nameserver, {202, 106, 46, 151}, 53}.

次にerlを起動します.

erl -kernel inetrc './erl_inetrc'

実行:

testdns:dns()

12個のdnsリクエストがすべて成功したことを発見しました!