Boost::Asio-将套接字传递给第二类



我目前正在尝试让以下应用程序工作:

  1. 等待传入的客户端连接
  2. 启动异步。计时器在另一个类中
  3. 当计时器重复运行时,执行其他操作,如async_readasync_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|socket@000000000021FBD0.async_accept
@asio|1461070498.527997|>1|ec=system:0

问题

  1. 为什么它甚至不在startTimer中调用async_wait?调试显示调用了startTimer,但在处理程序跟踪输出中找不到任何内容。为什么
  2. 我是否正确地将套接字传递给TimerClass
  3. 如果acceptHandler中没有无限while(true)循环,acceptHandler将返回,但应用程序在io_service正确返回之前崩溃。怎么了

我编译了你的代码,它对我来说很有效(使用boost版本1.54)。

使用您的代码,我得到以下输出:

@asio|1461081908.437388|0*1|socket@003BFE2C.async_accept 
@asio|1461081983.220840|>1|ec=system:0    
@asio|1461081983.221817|1*2|deadline_timer@001C1318.async_wait

为了使它正常运行,我必须删除acceptHandler上的while(true),从而获得以下输出(在处理程序中添加了一个std::cout):

@asio|1461083707.104424|0*1|socket@0030FB6C.async_accept
@asio|1461083709.061824|>1|ec=system:0
@asio|1461083709.062803|1*2|deadline_timer@00641318.async_wait
@asio|1461083709.062803|<28158494073611763|
@asio|1461083710.064992|>2|ec=system:0
@asio|1461083710.064992|2|deadline_timer@00641318.cancel
@asio|1461083710.064992|2*3|deadline_timer@00641318.async_wait
TimerHandler executed...
@asio|1461083710.065971|<28169626628843099|
@asio|1461083711.065223|>3|ec=system:0
@asio|1461083711.065223|3|deadline_timer@00641318.cancel
@asio|1461083711.065223|3*4|deadline_timer@00641318.async_wait
TimerHandler executed...

实际上,我只使用了头TimerClass.hpp(直接在其中定义方法——我很懒——)进行了这个测试,它的工作方式很有魅力,问题似乎是在使用.cpp文件时,这就是为什么我问你是否使用了include guard(虽然不是问题,已经测试过了)。


不过,您应该考虑更改您的设计方法,即不要在处理程序中使用阻塞循环,只需在需要时调用另一个异步操作(如async_readasync_write)。

看看这个问题和相应的公认答案,可以找到一个不错的服务器实现想法。或者尝试根据您的需要调整一些助推示例。

根据在相应的头文件和实现文件中将声明与定义分离时出现的分段错误,您可能需要检查其他问题。

最新更新