c-ares の大雑把な機能紹介

c-ares については過去の記事で少し触れた。c-ares は以下に詳細な API リファレンスが存在するが、Web サイトトップより詳しく、API リファレンスよりも大雑把な機能紹介がないのがもったいない。

というわけで、c-ares を簡単に紹介しておく。まずは Web サイトトップに書いてあること。

  1. 非同期名前解決ができる
    1. 大抵のプラットフォームで呼び出すことができる gethostbyname、getaddrinfo は同期呼び出しのみ
  2. C ライブラリとして提供される
  3. IPv6 に対応している
  4. 様々なプラットフォームに対応していて移植性に優れている
    1. Windows
    2. Mac OS X
    3. Linux
    4. Android
    5. etc..
  5. 今も活発に開発が行われている
    1. メーリングリストが活発
    2. メインメンテナの Daniel Stenberg 氏が活発


ソースコードを見たり実際にコードを書いたり実行したりして分かったこと。

  1. 非同期処理中の待機処理は、基本的に呼び出し側で select を使って行う
    1. ares_getsock()を使えばプラットフォームに適したもっと効率のよい待機処理ができるだろう
  2. ares_gethostbyname
    1. アドレスファミリを AF_UNSPEC として指定した場合、IPv4 での名前解決が優先される
    2. AF_INET、AF_INET6 を同時に名前解決することはできない
    3. 付属のサンプルプログラム ./ahost localhost で実行するとこの挙動を確認することができる
  3. 名前解決するときに DNS サーバ名とそのポートを指定することができる
    1. ares_init_options()
  4. DNS クエリを投げるだけでなく、hosts ファイルの内容を加味してくれる
    1. https://github.com/bagder/c-ares/blob/master/ares_gethostbyaddr.c#L180
    2. ただし、Windows で hosts ファイルのパスが Unicode には対応していない模様
  5. IDN への対応はまだっぽい?
    1. ソースコードを IDN で grep してもそれらしきコードがない
    2. Punycode 化だけしてやればいける?
      1. RFC3492 プニコード:アプリケーションの国際化ドメイン名(IDNA)のためのユニコードブースティングコーディング


Daniel Stenberg 氏は、自身の HTTP クライアントアプリ、ライブラリである curl、libcurl のためにこれを作ったらしい。映画のソーシャル・ネットワークでは、wget が出てくるらしいが curl でないのが少し残念である。