CLX C++ Libraries - resolver
Author: clown

CLX C++ Libraries
Home >> resolver

# 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

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 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;