CLX C++ Libraries
Home >> resolver

Declaration

template <int Family>
class basic_resolver;

typedef basic_resolver<AF_INET> resolver;

int port(const std::string& service, const std::string& protocol);
int port(const char* service, const char* protocol);

namespace tcp {
    int port(const std::string& service);
    int port(const char* service);
}

namespace udp {
    int port(const std::string& service);
    int port(const char* service);
}

namespace ssl {
    int port(const std::string& service);
    int port(const char* 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

example_resolver.cpp

#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 ipaddr_type;
typedef size_t size_type;
typedef char char_type;
typedef std::basic_string<char> string_type;
typedef std::vector<address_type> ipaddr_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() throw();

コンストラクタの引数に文字列が指定された場合,指定された引数で lookup() メソッドを実行します.lookup() メソッドについては後述します.

bool lookup(const char_type* s);
bool lookup(const string_type& s);

指定された文字列の名前解決を行います.lookup() メソッドは,まず始めに, 指定された文字列をドット区切りの IP アドレス (e.g., 192.168.0.1) と見なして名前解決を試みます. 失敗した場合は,次に指定された文字列をホスト名 (e.g., www.example.com) と見なして再試行します. 戻り値は,いずれも失敗した場合には false, それ以外の場合は true です.

const address_list& addresses() const;

addresses() は,名前解決した IP アドレスの配列 (std::vector<ipaddr_type>) を返します. 現在の DNS では,1 つのホスト名に対して複数の IP アドレスを割り当てる事ができます. そのため,名前解決を行った後に得られる IP アドレスは複数存在することもあります. それぞれの ipaddr_type をドット区切りの IP アドレス(文字列)として取得したい場合は, adresses() メソッドで得られた各要素に対して,inet_ntoa() などを適用します.

const string_type& hostname() const;
const alias_list& aliases() const;

ホスト名,およびホスト名の別名を返します.現在の DNS では,ある IP アドレスに対して, 正式なホスト名とは別に複数の別名を設定する事ができます.別名が設定されている場合には, aliases() メソッドを通じて,それらの名前を取得する事ができます.

int length() const;

アドレス長を返します.アドレス長は,ユーザがソケットを操作するシステムコールを 直に操作する場合に必要になる事があります.