私はboost :: asioライブラリを使用して非同期の読み込みと書き込みを行うソケットクラスを作成しました。それは動作しますが、いくつか質問があります。boost :: asio非同期操作とリソース
ここでは基本的なコードの例です:
class Socket
{
public:
void doRead()
{
m_sock->async_receive_from(boost::asio::buffer(m_recvBuffer), m_from, boost::bind(&Socket::handleRecv, this, boost::asio::placeholders::error(), boost::asio::placeholders::bytes_transferred()));
}
void handleRecv(boost::system::error_code e, int bytes)
{
if (e.value() || !bytes)
{
handle_error();
return;
}
//do something with data read
do_something(m_recvBuffer);
doRead(); //read another packet
}
protected:
boost::array<char, 1024> m_recvBuffer;
boost::asio::ip::udp::endpoint m_from;
};
プログラムが、パケットを読んで、それを処理し、別のものを読むために準備するようです。シンプル。 しかし、スレッドプールを設定するとどうなりますか?読み取ったデータを処理する前または後に、doRead()
への次の呼び出しを行う必要がありますか?もしそれがdo_something()
の前に置かれていれば、プログラムはすぐに別のパケットの読み込みを開始することができ、それが後に置かれれば、スレッドはdo_something()
の何らかのことをして結ばれているようです。処理の前にdoRead()
を置くと、処理中にm_readBuffer
のデータが変わる可能性がありますか?
また、async_send_to()
を使用している場合、実際の送信はデータが有効範囲外になるまで発生しないため、送信するデータを一時バッファにコピーする必要がありますか?すなわち
void send()
{
char data[] = {1, 2, 3, 4, 5};
m_sock->async_send_to(boost::buffer(&data[0], 5), someEndpoint, someHandler);
} //"data" gets deallocated, but the write might not have happened yet!
さらに、ソケットが閉じられると、中断されたことを示すエラーとともにhandleRecvが呼び出されます。呼び出されるmySocket
がhandleRecv()
前に削除される可能性があるので、私は、それがエラーを引き起こす可能性
Socket* mySocket = new Socket()...
...
mySocket->close();
delete mySocket;
を行う場合/終了?
+1良い質問がありますが、将来私はそれをStackoverflowの別の質問に分割することをお勧めします。 –