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
#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_rawsocket<SOCK_STREAM, Family> rawsocket; typedef basic_sockaddress<Family, IPPROTO_TCP> sockaddress; 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); basic_socket<Family> accept();