質問

なので、

ていたんさんの力に認識機能を、ソケット(具体的には、非同期読出し/書込み).今思ったのですが boost::asio::async_read にだけ呼び出されるハンドラに新しいバッファーとなったネットワークから接続---しかしな読むのを止め、同じバッファは、このように常に呼び出しハンドラです。していを軽減でチェックのバイト数を転送できますが、そこでは基本的には忙しい毎日にゆとりをくれる、待機ループを無駄にCPUサイクル。

こちらはなんとい:

class tcp_connection : : public boost::enable_shared_from_this<tcp_connection> 
{
public:
    // other functions here

    void start()
    {
    boost::asio::async_read(socket_, boost::asio::buffer(buf, TERRAINPACKETSIZE),
        boost::bind(&tcp_connection::handle_read, shared_from_this(),
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
    }

private:
    const unsigned int TERRAINPACKETSIZE = 128;
    char buf[TERRAINPACKETSIZE];


    void handle_read(const boost::system::error_code& error, size_t bytesT)
    {
        if (bytesT > 0)
        { 
             // Do the packet handling stuff here
        }

        boost::asio::async_read(socket_, boost::asio::buffer(buf, TERRAINPACKETSIZE),
        boost::bind(&tcp_connection::handle_read, shared_from_this(),
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
    }
};

一部のものは切り出したものの、基本的には新しい接続の作成されその後 start() が呼び出されます。ものがあるのか、それは何なのか私が欠で handle_read 方法がない続けて呼ぶの?

役に立ちましたか?

解決

ワイルドな推測: handle_read error をチェックしますか?何らかの理由でソケットがエラー状態にある場合、 handle_read から async_read へのネストされた呼び出しはすぐに「完了」し、すぐに呼び出しが行われると思います handle_read

他のヒント

しかし、同じ問題です。私の場合、読み込std::vectorのようになります:

boost::asio::async_read(socket_,
st::asio::buffer(*message,message->size()),
            boost::bind(
              &ActiveSocketServerSession::handleFixLengthRead,
              shared_from_this(),
              boost::asio::placeholders::error,
              boost::asio::placeholders::bytes_transferred)
    );

いadaptativeベクターのための受け入れる異形バイト数

    std::vector<unsigned char>* message;
message = new std::vector<unsigned char> (sizePacket);

私のすべてのパケットしたものの、停止解除handle_readerのないデータです。

私の溶液を削除する私のベクターおよびallocスペースが再び加工後で:

void ActiveSocketServerSession::handleFixLengthRead(    const         boost::system::error_code& error,
                                                    std::size_t bytes_transferred){

    --> processing your data (save to another site)
--> delete message;
--> message = new std::vector<unsigned char> (sizePacket);

//starting to read again
boost::asio::async_read(socket_,
                boost::asio::buffer(*message,message->size()),
            boost::bind(
              &ActiveSocketServerSession::handleFixLengthRead,
              shared_from_this(),
              boost::asio::placeholders::error,
              boost::asio::placeholders::bytes_transferred)
);

    }else{
        logMessage.str("");
        logMessage << "Error handling data id: "<<getId()<< "from port";
    }
}

またこのソリューションは読書 この

を入れた後、この二つとしてこれまでに培ってきた。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top