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