关于使用boost asio库 出现的一些问题的总结

最近在使用boost库的时候,因为可能是自己的c++学的还不是很扎实吧,出现了很多令人啼笑皆非的错误。而且,我也不太能从一些错误提示中找到正确的解决思路。下面就是我的一个错误总结吧。

一开始我对于boost asio库的运行模式不是很理解,经过一些错误总算有一点头绪。

io_service的作用

首先asio库主要就是对一些io进行操作,其中就有我的项目比较需要的网络socket的一些io功能。

首先,asio封装了一个io_service这样一个类,用来连接用户的程序和操作系统之间的一些io服务。

在asio库里面你可以选择以同步或者异步的方式对IO进行操作,异步操作的方法前面会有async_

针对同步的操作

用户程序在需要io操作的时候会将任务或者请求发送给io_service,之后io_service会接收到操作系统的一些执行结果,之后如果错误的话会抛出异常

针对异步的操作

用户程序的io操作还是会由io_service来处理但是异步就意味着,不会在原地等待操作完成,所以会将任务放在队列里面。当系统的任务完成之后就会将结果放在队列里面通知io_service并且调用相应的回调函数。要注意的是回调函数的格式一定要准确,签名一定要保证其正确性。

注意:io_service一般会在调用第一个异步函数之后调用,io_service的run函数阻塞接收相应的未完成的回调函数。

异常的形式

  • IO对象抛出boost::system::system_error类型的异常
    try
	{
	  socket_->open(ip::tcp::v4()); 
	}
	catch(boost::system::system_error const& e)
	{
	  std::cout << "Warning: could not connect : " << e.what()  << std::endl;
	}
  • 在异步函数的回调函数里面我们会使用error_code来查看错误情况,但不会抛出异常 

void Handle::ReadHandler(const boost::system::error_code& ec, size_t bytes_transferred)
{
	 if(ec)
	 {		 
		std::cout << "READ failed, error code:" << ec.value()
				  << " category name:" << ec.category().name()
				  << " message:" << ec.message();
		 return;
	 }
}

错误码125 : operation canceled

出现这个错误是因为我的服务端在accept客户端之后没有保存好socket,之后呢析构了。这就会导致连接直接被中断,如果连接被中断就会直接调用所有的回调函数,并且返回一个错误码就是125.或者是一些回调函数返回misc:2这个错误码。

关于一些类的安全性

有些类比如socket,boost::streambuf为了保护实例是独一无二的,会将拷贝构造函数放在私有的权限下。也就是说禁止拷贝构造,所以我们可以看到很多地方我们都是用引用变量,避免拷贝构造,并且节省效率。我之前不清楚,现在才理解。

猜你喜欢

转载自blog.csdn.net/weixin_42427338/article/details/83514769
今日推荐