をソケットを渡すには:ブースト:: ASIO - 私は現在、以下のアプリケーションが動作するように取得しようとしています第二のクラスに
- は、着信クライアント接続を待ちます。
- 非同期を開始します。他のクラスのタイマー。
- タイマーが繰り返し実行されている間に、
async_read
とasync_write
などの他のものを実行します。
現在のソースコード:
#define BOOST_ASIO_ENABLE_HANDLER_TRACKING
#include <WinSock2.h>
#include <Mswsock.h>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include "TimerClass.hpp"
using namespace boost::asio;
using namespace boost::asio::ip;
TimerClass *timerClass;
void acceptHandler(const boost::system::error_code &errorCode, tcp::socket *socket) {
timerClass = new TimerClass(socket);
timerClass->startTimer();
while(true) {
// Do other suff such as async_write, ...
}
}
int main(int argc, char** argv) {
io_service ioService;
tcp::socket socket(ioService);
tcp::acceptor acceptor{ ioService, tcp::endpoint{ tcp::v4(), 12345 } };
acceptor.listen();
acceptor.async_accept(socket, boost::bind(acceptHandler, _1, &socket));
ioService.run();
return EXIT_SUCCESS;
}
TimerClass.hpp:
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::asio;
using namespace boost::posix_time;
class TimerClass {
public:
TimerClass(ip::tcp::socket *socket);
void startTimer();
void timerHandler(const boost::system::error_code& errorCode);
deadline_timer timer;
};
TimerClass.cpp:
#include <boost/bind.hpp>
#include "TimerClass.hpp"
TimerClass::TimerClass(ip::tcp::socket *socket) : timer(socket->get_io_service(), boost::posix_time::seconds(1)) {}
void TimerClass::startTimer() {
timer.async_wait(boost::bind(&TimerClass::timerHandler, this, boost::asio::placeholders::error));
}
void TimerClass::timerHandler(const boost::system::error_code& errorCode) {
timer.expires_at(timer.expires_at() + boost::posix_time::seconds(1));
timer.async_wait(boost::bind(&TimerClass::timerHandler, this, boost::asio::placeholders::error));
}
ハンドラのトラッキング出力:
@asio|1461070492.111630|0*1|[email protected]_accept
@asio|1461070498.527997|>1|ec=system:0
質問:
- なぜそれがさらに
startTimer
でasync_wait
を呼び出すことではないでしょうか?デバッグではstartTimer
が呼び出されますが、Handler Trackingの出力では何も見つかりません。何故ですか? - ソケットをTimerClassに正しく渡していますか?
- acceptHandlerでwhile(true)ループを無制限に実行しないと、acceptHandlerは返しますが、io_serviceが正しく返される前にアプリケーションがクラッシュします。それはどうですか?
コードをコンパイルしましたが、実際には 'async_wait'の呼び出しがあります。どのブーストバージョンを使用していますか(1.54で試しました)。ハンドラのトラッキング出力: '@asio | 1461081908.437388 | 0 * 1 | [email protected]_accept @asio | 1461081983.220840 |> 1 | EC =システム:0 @asio | 1461081983.221817 | 1 * 2 | deadline_timer @ 001C1318.async_wait' – Nacho
@ Nachoバージョン1.59.0を使用しています - あなたの実行でタイマーが実際に動作しますか?毎秒実行する必要があります。 – chrisp
実際には、私は 'while(true)'を削除しなければなりませんでした。ああ、私は何が問題だろうか知っています。 'TimerClass.hpp'にガードを含んでいますか? – Nacho