2012-03-22 21 views
0

我是新来的插座IO。我一直在使用socket::read_some()从套接字中提取数据。我相信我所要求的数据插座往往比数据是可用的插座上,这样看来的“read_some阻塞性质()`就是在该数据来自在插座上的速度减缓我的程序的执行。我想检查数据,然后继续前进,如果什么都不存在。我的代码目前看起来是这样的:检查升压:: ASIO套接字数据之前读?或者我应该使用async_read()?

unsigned char incomingData[PARTIAL_PKT_BUFF_SIZE]; 
int numRead = 0; 
numRead = 
    _socket.read_some(boost::asio::buffer(incomingData,PARTIAL_PKT_BUFF_SIZE)); 

如果我实现了在this question第一个答案的代码,它看起来像我将使用一个bytes_readable对象来控制插座,然后我可以做检查,看是否bytes_readable::get()返回大于零,然后读取套接字。

它看起来像一个async_read()可能做的工作,但我必须承认,我真的不明白。看起来我需要注册回调,这表明我可能需要在缓冲区周围设置一些安全机制。我是否认为这是一个更复杂的解决方案?

+2

异步IO稍微复杂一些,但折衷几乎总是值得的。我的投票绝对会转移到'async_read()'。如果你不想使用异步IO,为什么即使使用普通老套接字来提升呢? – Chad 2012-03-22 21:02:54

+0

我的吸引力提高的很大一部分是它的平台无关性。 – 2NinerRomeo 2012-03-22 22:35:20

+0

@ 2NinerRomeo我相信乍得人的观点是,使用boost.asio并没有使用异步I/O,你并没有真正获得太多收益。 – 2012-03-23 20:26:12

回答

1

我想检查数据,然后继续前进,如果没有出现

你刚才描述的被称为轮询的方法。

它看起来像一个async_read()可能会做这项工作,但我必须承认我 真的不明白它。

正确,async_read()是这里的完美解决方案。

它看起来像我需要注册一个回调 ,这表明我可能会需要把一些安全 机制周围的缓冲区。我是正确的思维,这是一个更复杂的 解决?

您将需要回调事件循环以在读取操作完成时通知您的应用程序。你不需要任何种类的安全机制。一旦您将头部缠绕在倒流式流量控制装置上,这不是一个复杂的解决方案。有几个examples和一个tutorial向您展示了如何编写异步I/O程序。如果遇到问题,请研究它们并在Stackoverflow上提出问题。

0
asio::streambuf s_buf; 
asio::async_read_until(sock, s_buf, '\n', std::bind(completionHandler, std::placeholders::_1)); 
std::string message; 
std::istream input_stream(&s_buf); 
std::getline(input_stream, message); 
std::cout << message << std::endl; 
// Whenever it successfully read an entire message ; it will call the function completion handler. 
void completionHandler(const boost::system::error_code& ec) 
{ 
    if (ec != 0) 
    { 
     std::cout << "Error occured! Error code = " << ec.value() << ". Message: " << ec.message(); 
     return; 
    } 
} 
相关问题