CLX C++ Libraries
Home >> tcp::acceptor

Declaration

namespace tcp {
    template <
        int Family,
        class CharT = char,
        class Traits = std::char_traits<CharT>
    >
    class basic_serversocket : public basic_rawsocket<SOCK_STREAM, Family>;
    
    typedef basic_acceptort<AF_INET> acceptor;
};

Overview

サーバ/クライアント型モデルで TCP 通信 を行うときに,サーバ用の(TCP の) ソケットを生成するためのクラスです.tcp::acceptor は,クライアントからの TCP コネクション確立要求を受諾するまでの作業を担います.tcp::acceptor は, クライアントとのTCP コネクションが確立すると tcp::socket オブジェクトを返すので,実際のデータ転送は返された tcp::scoket,または, tcp::sockstream を用いて行います.

tcp::acceptor は,クライアントとの TCP コネクションの確立に失敗すると socket_error を例外として送出します.また,ポート番号としてサービス名 (http, ftp, ...) を指定した場合に,サービス名に対応するポート番号が分からないときには sockaddress_error を例外として送出します.

Example

// example_tcp_server.cpp
#include <iostream>
#include <string>
#include "clx/tcp.h"

int recv(clx::tcp::socket sock);

int main(int argc, char* argv[]) {
    if (argc < 2) return -1;
    try {
        clx::tcp::acceptor s(argv[1]);
        clx::tcp::socket clt = s.accept();
        
        std::cout << clt.address().ipaddr() << ':'
            << clt.address().port()
            << " Connection was established" << std::endl;
        
        s.close();
        if (recv(clt) == -1) return -1;
        else {
            std::cout << clt.address().ipaddr() << ':'
                << clt.address().port()
                << " Connection was closed" << std::endl;
            clt.close();
        }
    }
    catch (clx::socket_error& e) {
        std::cerr << e.what() << std::endl;
        return -1;
    }
    catch (clx::sockaddress_error& e) {
        std::cerr << e.what() << std::endl;
        return -1;
    }
    
    return 0;
}

int recv(clx::tcp::socket sock) {
    clx::tcp::sockstream ss(sock);
    std::string msg;
    while (1) {
        std::string buf;
        ss >> buf;
        if (buf.empty()) break;
        msg += buf;
    }
    std::cout << "Receive messages: " << msg << std::endl;
    return 0;
}

Template Parameters

Family
プロトコルファミリーを指定します.
CharT
文字の型を指定します.デフォルト値は,char.
Traits
文字列を扱うためのtraitsを指定します.デフォルト値は, std::char_traits<CharT>.

Related Types

typedef basic_rawsocket<SOCK_STREAM, Family> rawsocket;
typedef basic_sockaddress<Family, IPPROTO_TCP> sockaddress;
typedef CharT char_type;
typedef typename std::basic_string<CharT, Traits> string_type;

Construction and Member Functions

basic_acceptor();
explicit basic_acceptor(int port, int n = nlisten);
explicit basic_acceptor(const char_type* service, int n = nlisten);
explicit basic_acceptor(const string_type& service, int n = nlisten);
virtual ~basic_acceptor();

コンストラクタでは,ポート番号,またはサービス名 (http, ftp, ...) を指定してサーバ用ソケットを作成します. デフォルトコンストラクタで tcp::acceptor オブジェクトを生成したの場合は, ソケットが作成されません.そのため,tcp::accept オブジェクト生成後にユーザが open() メソッドを呼び出す必要があります.

basic_acceptor& open(int port, int n = nlisten_default);
basic_acceptor& open(const char_type* service, int n = nlisten_default);
basic_acceptor& open(const string_type& service, int n = nlisten_default);
basic_socket<Family> accept(int nretry = 10);