gpt4 book ai didi

c++ - async_connect 上的 boost::asio 完成处理程序在第一次失败后不再调用

转载 作者:行者123 更新时间:2023-11-30 03:19:06 26 4
gpt4 key购买 nike

我正在编写一个使用 boost asio 连接到远程套接字的小型客户端类。如果初始连接失败,它应该能够尝试重新连接。

在测试该场景时,即没有打开的远程套接字,第一次正确调用了 async_connect 的完成处理程序。但是当 m_state 再次进入 State_Connect 时,我的完成处理程序将永远不会再次调用第二次尝试。我做错了什么?

class Test
{
public:
Test() : m_socket(m_io)
{
}

void update()
{
switch (m_state)
{
case State_Connect:
std::cout << "Start connect\n";
m_socket.async_connect(tcp::endpoint(tcp::v4(), 33000),
boost::bind(&Test::onCompleted, this, asio::placeholders::error));
m_state = State_Connecting;
break;

case State_Connecting:
if (m_error)
{
m_error.clear();
std::cout << "Could not connect\n";
m_state = State_Connect;
}
break;
}

m_io.poll_one();
}

private:
void onCompleted(const bs::error_code& error)
{
if (error)
{
m_error = error;
m_socket.close();
}
}

enum State
{
State_Connect,
State_Connecting,
};
State m_state = State_Connect;

asio::io_service m_io;
tcp::socket m_socket;
bs::error_code m_error;
};

int main(int argc, char* argv[])
{
Test test;
for (;;)
{
test.update();
boost::this_thread::sleep(boost::posix_time::milliseconds(20));
}
return 0;
}

输出是: 开始连接 无法连接 开始连接

但我希望它会无限期地重复。

最佳答案

Reference

When an io_context object is stopped, calls to run(), run_one(), poll() or poll_one() will return immediately without invoking any handlers.

当您调用 poll_one() 并且没有处理程序准备就绪时,poll_one() 函数会将 io_service 标记为已停止。当 m_stateState_Connecting 时,poll_one() 无关,此时 io_service 由于处理程序队列为空而被标记为已停止。

你可以测试io_service是否停止了,如果是则调用reset:

if (m_io.stopped())
m_io.reset();
m_io.poll_one();

关于c++ - async_connect 上的 boost::asio 完成处理程序在第一次失败后不再调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54095005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com