残念ながら、boost::asio::ip::tcp::acceptor がどのように使用されることになっているのか正確に理解できないため、開発が滞っています。TCPReader クラスはシングルトンとして設計されており、ヘッダーは以下をプライベートとして宣言します。
void runInThread();
void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred);
void accept_handler(const boost::system::error_code &ec);
boost::asio::io_service io_service;
boost::asio::io_service::work runningService;
boost::asio::ip::tcp::socket sock;
boost::asio::ip::tcp::acceptor acceptor;
bool isConnected;
<<
TCPReader::TCPReader() : sock(io_service),
runningService(io_service),
acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), TCPPort)){
this->isConnected = false;
acceptor.async_accept(sock, boost::bind(&TCPReader::accept_handler, this, boost::asio::placeholders::error));
boost::thread thread(boost::bind(&TCPReader::runInThread, this));
}
void TCPReader::runInThread(){
io_service.run();
}
accept_handler は read_handler をトリガーし、read_handler が EOF または別のエラーを受け取るまで、すべてが魅力のように機能します。私が望むのは、アクセプターを初期化後のように接続を受け入れることができる状態に戻すことです。close()
orcancel()
を次open()
の , listen()
and async_accept
(コンストラクターのように) で試しました。しかし、それはすべてうまくいかないようです。よろしくお願いいたします。