2

私のクラスの受信者...文字列を受け取り、それをバッファにプッシュします。

Reciever::Reciever(boost::shared_ptr<TSBuffer<std::string>> buffer, int port)
    : port(port), buffer(buffer)
{
    using namespace boost::asio;
    acceptor_ = new ip::tcp::acceptor(iosev, ip::tcp::endpoint(ip::tcp::v4(),  port));
}


Reciever::~Reciever()
{
    delete acceptor_;
}

void Reciever::run()
{
    using namespace boost::asio;
    _start();
    iosev.run();
}

void Reciever::stop()
{
    Sender s("127.0.0.1", std::string(8, '$'), port);
}

void Reciever::_start()
{
    using namespace boost::asio;
    boost::shared_ptr<ip::tcp::socket> socket(new ip::tcp::socket(iosev));
    acceptor_->async_accept(*socket, boost::bind(&Reciever::acceptHanlder, this, socket));
}

void Reciever::acceptHanlder(boost::shared_ptr<boost::asio::ip::tcp::socket> socket)
{
    std::string delim(8, '$');
    boost::system::error_code ec;
    boost::asio::streambuf strmbuf;

    boost::asio::read_until(*socket, strmbuf, delim, ec);
    std::istream is(&strmbuf);
    std::string re((std::istreambuf_iterator<char>(is)),std::istreambuf_iterator<char>());
    re.replace(re.end() - delim.size(), re.end(), "");
    if (re.size() && re != std::string(8, '$')){
        buffer->push(re);
        _start();
}

main() 関数では、X(uncertain) スレッドを使用して X 文字列を受信者に送信します。Reciever::acceptHanlder が X 回呼び出されたとき (つまり、X 文字列が処理されたとき)、受信者を停止したい (Reciever::stop を呼び出す)。しかし、私はそれを確認する方法がわかりませんか?

4

1 に答える 1

2

acceptHanlderの最後の行の前にasync_acceptを呼び出すことはできないことがわかりました。したがって、単純にRecieverオブジェクト内にカウンターを実装し、ジョブが完了したときに_startを呼び出さないでください。同じレシーバーが異なるスレッドで使用される場合、はるかに複雑になるため、「接続用のオブジェクト」パラダイムを使用することを好みます。

また、asio::strandacceptHanlderを使用して-sを制限することもできます。これacceptHanlderにより、指定されたもののうちの 1 つだけRecieverがいつでもアクティブになります。これにより、 内での同時実行の問題が解消されますReciever。したがって、安全に呼び出すことができますReciever::stop(同じストランドを使用)。

于 2012-11-16T19:00:04.743 に答える