ASIO io_service运行多次的问题
Issue with ASIO io_service to run multiple time
在我的问题。我是一个客户,我的目的只是在需要的时候在服务器上写东西,而不是每次都写。
我有一个单例类(Caller类),我调用我的客户端程序(client)在服务器上写任何消息然后调用boost::asio::io_service::通过一个线程运行。我的客户端程序(client)也是单例类。
如果服务器已经运行,我的程序可以正常工作。因为客户端将在第一个实例中连接到服务器。但是,如果服务器重新启动或不运行,那么首先我必须检查服务器是否在写消息之前运行。
每次检查服务器是否可用,我必须调用Caller::run()并运行io_service。
如果没有运行io_service,我无法检查服务器是否正在运行,因为我在程序中使用所有同步。一切都是async (asyncn connect, sync write)
我的问题是,有时我的程序去+D1状态(不间断睡眠),然后我无法关闭我的程序。这是由于io_service()吗?
如果不运行io_service,如何检查服务器是否打开?
class Caller
{
public:
static Caller* getInstance()
{
static Caller Caller;
return &Caller;
}
void run()
{
pWork.reset( new boost::asio::io_service::work(io_service) );
////////////calling client program////////////////
Client::getInstance(io_service)->start();
thread = boost::thread(boost::bind(&boost::asio::io_service::run, &io_service));
}
boost::asio::io_service io_service;
boost::shared_ptr<boost::asio::io_service::work> pWork;
boost::thread thread;
private:
Caller()
{
}
~Caller()
{
pWork.reset();
thread.join();
}
};
///////////my client program (Singleton Class)//////////////////
//////message write function///////////
void Client::sendResponse(std::string& messag)
{
boost::system::error_code error;
boost::asio::ip::tcp::endpoint endpoint = socket().remote_endpoint(error);
if ( error )
{
DEBUG_2("could not write: ",boost::system::system_error(error).what());
this->stop(); /////this will close the socket////
Caller::getInstance()->run();
//////it will call the caller program to call the connect function of client program /////
}
else
boost::asio::async_write(
_socket,
boost::asio::buffer( message.c_str(), message.size()),
_strand.wrap(
boost::bind(
&Client::writeHandler,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
}
Client *Client::getInstance(boost::asio::io_service& io_service)
{
if (!Client)
{
Client = new Client(io_service);
}
return Client;
}
我可以这样设计,我只写到服务器,而不需要一次又一次地运行io_service。或者我需要调用io_service::reset()我是否以正确的方式使用工作?
我怎样才能优雅地停止或中止这个进程?通过调用io_servie::stop或者加入这个线程?
检测连接有效性的典型方法是在连接成功后执行async_read()
。当async_read()
回调指示boost::asio::error::eof
错误时,您的应用程序应该做出适当的反应:
- 重新连接,可能有超时延迟
- 终止优雅
听起来你需要选项1。如果编写正确,您的应用程序应该只需要调用io_service::run()
一次,事件循环将不断有工作要做。
如果你不想从套接字中读取来检测闭包,实例化一个work
对象,并在程序运行期间将其保持在作用域中。这将确保io_service
总是有工作要做。当您的async_write
完成处理程序被调用并出现错误时,请按照前面的建议对您的应用程序做出必要的反应。
- 运行程序时出现问题
- 循环无限运行C++解决骑士之旅问题
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 如何修复 Onnx运行时会话>运行问题?
- C++ 每次运行程序时我都会"nan"输出的问题
- 在 c++ 中使用 Tensorflow Lite 在边缘 TPU 上运行"mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite"时出现问题
- 使用 ubuntu 终端在 c++ 上运行线程类的问题
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 'make check' GLIBC 运行时的链接问题
- 运行长度编码程序 c++ 的问题
- 运行无限循环的最小二叉树问题
- 运行veins_inet示例 - 未定义的引用的 Omnet++ 问题
- 运行莱文斯坦代码时出现问题
- 父进程意外被子 cmd 杀死.exe运行 java jar 的进程 - WINDOWS 7 问题 - C++
- 运行时C++数组初始化问题
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- C++程序编译没有问题,但无法运行
- 提升反序列化问题:运行时输入流错误 (c++)
- 问题运行样本在Mac Pro X86_64 V8引擎