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

Declaration

namespace tcp {
    template <int Family>
    class basic_acceptor : public basic_rawsocket<SOCK_STREAM, Family>;
    
    typedef basic_socket<AF_INET> socket;
    typedef basic_sockaddress<AF_INET, IPPROTO_TCP> sockaddress;
    typedef basic_acceptor<AFINET> acceptor;
    typedef basic_sockbuf<socket> sockbuf;
    typedef basic_sockstream<socket> sockstream;
    typedef basic_sockmanager<SOCK_STREAM, AF_INET, 0> sockmanager;
};

Overview

サーバ/クライアント型モデルで TCP 通信 を行うときに,サーバ用の(TCP の) ソケットを生成するためのクラスです.tcp::acceptor は,クライアントからの TCP コネクション確立要求を受諾するまでの作業を担います.tcp::acceptor は, クライアントとのTCP コネクションが確立すると tcp::socket オブジェクトを返すので,実際のデータ転送は返された tcp::scoket,または, tcp::sockstream を用いて行います.tcp::acceptor は,クライアントとの TCP コネクションの確立に失敗すると socket_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) std::exit(-1);
    try {
        clx::tcp::acceptor s(clx::tcp::port(argv[1]));
        
        while (1) {
            clx::tcp::socket clt = s.accept();
            std::cout << clt.address().ipaddr() << ':' << clt.address().port()
                << " Connection was established" << std::endl;
            
            if (recv(clt) == -1) break;
            else {
                std::cout << clt.address().ipaddr() << ':' << clt.address().port()
                    << " Connection was closed" << std::endl;
                clt.close();
            }
        }
        s.close();
    }
    catch (clx::socket_error& e) {
        std::cerr << e.what() << std::endl;
        std::exit(-1);
    }
    catch (clx::sockaddress_error& e) {
        std::cerr << e.what() << std::endl;
        std::exit(-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;
}

クライアント側のサンプルプログラムについては,tcp::socket を参照して下さい (example_tcp_client.cpp).

Template Parameters

Family
プロトコルファミリーを指定します.

Related Types

typedef basic_sockaddress<Family, IPPROTO_TCP> address_type;
typedef char char_type;
typedef typename std::basic_string<char> string_type;

Construction and Member Functions

basic_acceptor();
explicit basic_acceptor(int port, int n = nmax);
virtual ~basic_acceptor();

コンストラクタでは,ポート番号を指定してサーバ用ソケットを作成します.

basic_acceptor& open(int port, int n = nmax);

open() メソッドは,指定されたポート番号を用いてクライアントからの接続要求を 待ち受けるためのサーバ用 TCP ソケットを生成します. クライアントが一度に接続可能な最大値を n で指定する事ができます. サーバ用 TCP ソケットの生成に失敗した場合には,socket_error が例外として送出されます.

basic_socket<Family> accept();

accept() メソッドは,接続要求のあったクライアントとデータ通信を行うための TCP ソケットを生成します.データ通信を行うための TCP ソケットに関する詳細は, tcp::socket を参照して下さい.