Declaration
template <int Family>
class basic_resolver;
typedef basic_resolver<AF_INET> resolver;
int port(const string_type& service, const string_type& protocol);
int port(const char_type* service, const char_type* protocol);
namespace tcp {
int port(const string_type& service);
int port(const char_type* service);
}
namespace udp {
int port(const string_type& service);
int port(const char_type* service);
}
Overview
resolver は,名前解決を行うためのクラスです.IPアドレス <-> ホスト名の名前解決を行うことができます.実際には,gethostbyname() のラッパクラスとして実装されています.
名前解決を行うためには,lookup() メソッドへ名前解決を行いたいホスト名 or IPアドレスを指定します.lookup() メソッドは,名前解決に失敗すると false を返します.
名前解決を行った結果に対してのアクセスは,addresses(),hostname(),aliases() メソッドを用いて行います.IP アドレスおよびエイリアス名は複数存在する場合もあります. addresses(),aliases() メソッドで返されるオブジェクトはそれぞれ at() メソッドや size() メソッドを所持していますので,IP アドレスおよびエイリアス名がいくつ存在するのかについては, それらのメソッドを用いて調べることができます.
port() 関数は,サービス名 (e.g., http, smtp, smtp) からポート番号を導出します. port() 関数は,サービス名からポート番号の取得に失敗すると, 次に与えられた文字列を数字文字列と見なして変換を試みます.どちらにも失敗した場合には, -1 が返されます.tcp::port(), udp::port() 関数はそれぞれ port() 関数の第 2 引数に "tcp", "udp" を指定する事と等価です.
Example
#include <iostream>
#include "clx/resolver.h"
int main(int argc , char *argv[]) {
if (argc < 2) return -1;
clx::resolver addr;
if (!addr.lookup(argv[1])) {
std::cerr << "Cannot find " << argv[1] << ": Non-existent domain"
<< std::endl;
return -1;
}
std::cout << "Name: " << addr.hostname() << std::endl;
// print addresses
if (!addr.addresses().empty()) {
std::cout << "Address: " << inet_ntoa(addr.addresses().at(0));
}
for (size_t i = 1; i < addr.addresses().size(); i++) {
std::cout << ", " << inet_ntoa(addr.addresses().at(i));
}
std::cout << std::endl;
// print aliaseses
if (!addr.aliases().empty()) std::cout << "Alias: " << addr.aliases().at(0);
for (size_t i = 1; i < addr.aliases().size(); i++) {
std::cout << ", " << addr.aliases().at(i);
}
std::cout << std::endl;
return 0;
}
Result (www.yahoo.com) Name: www.yahoo.com Address: 68.142.197.78, 68.142.197.83, 68.142.197.86, 68.142.197.88, 68.142.197. 90, 68.142.197.64, 68.142.197.69, 68.142.197.75 Aliases: www.yahoo.com
Template Parameters
- Family
- プロトコルファミリーを指定します.
Related Types
typedef struct in_addr address_type; typedef char char_type; typedef std::basic_string<char> string_type; typedef unsigned int size_type; typedef std::vector<address_type> address_list; typedef std::vector<string_type> alias_list;
Construction and Member Functions
basic_resolver(); explicit basic_resolver(const char* s); explicit basic_resolver(const string_type& s); virtual ~basic_resolver(); bool lookup(const char_type* s); bool lookup(const string_type& s); const address_list& addresses() const; const string_type& hostname() const; const alias_list& aliases() const;