boost的asio中的read_util问题

原创 2011年01月13日 12:38:00

前两天同事在使用boost的read_util库的时候遇到一个很诡异的问题,如果用read_util("</data>")这样的调用,第一个请求可以得到,但是第二个请求会卡住,永远也拿不到。从服务器端看到的情况是,第二个响应已经完整的发送出去,但是read_util就是不返回。比较奇怪的是如果用read_util('>')这样调用,那是没有任何问题的。难道这个是read_util的bug?

 

首先我们要相信一个道理“问题越诡异,造成问题的原因越sb”。最终查找了半天才发现这个问题的根本所在。其实这就是一个在文本协议中使用了/0所造成的问题。read_util(string)这样的函数,它所用的肯定是string.find这样的函数,而这样的函数它是用字符串查找的,这表示它一旦遇到/0就不再往后查找了。

 

那么我们再来看看上面描述的那个问题,那个问题的关键在于每个响应最后会有一个/0字符。因此在第一个包读完之后,接下来读到的第一个字符就是/0,那么第二个包读的时候,不论读到多少数据,这个字符串的内容是/0xxxxxxxx,在这个一个长度为0的字符串上进行查找"</data>",必然找不到任何有用的信息。

 

结论:在处理网络流的时候,即使协议是文本协议,最好还是把它当作二进制来处理,或者用一些自己写的字符串匹配函数,否则可能会被/0给搞死。

boost::asio::socket::async_read_some

记录下今天发现的一个问题 void CBoostSocket::connect_hander(const boost::system::error_code& err) { if (err) { r...
  • linfengmove
  • linfengmove
  • 2013年12月20日 16:21
  • 2411

【Boost】boost库asio详解7——boost::asio::buffer用法

1. asio::buffer常用的构造方法 asio::buffer有多种的构造方法,而且buffer大小是自动管理的 1.1 字符数组 char d1[128]; size_t bytes_...
  • huang_xw
  • huang_xw
  • 2013年01月17日 13:27
  • 21479

boost::ASIO 读写

NO.1 ASIO 读操作大总结: A. Boos::asio::read 同步读方式 void client::read_data(char   * sourse  , int num ) ...
  • qq1987924
  • qq1987924
  • 2012年08月25日 11:06
  • 6367

ASIO中async_read_some和async_read有啥分别,分别在什么情况下用

内容摘自 Asio 网络群,江南先生。 async_read_some和async_read有啥分别,分别在什么情况下用? 查了一下资料,总结一下它们的区别,有不对的高手指出来 async_...
  • luopeiyuan1990
  • luopeiyuan1990
  • 2013年03月04日 10:15
  • 3033

boost::async_read_some连续接收数据

我在最近工作的时候用到了boost的http_server程序,这个http_server是一个框架用于接收并解析http协议。这个框架在接收get请求时没有任何问题,当接收post数据时,当数据大于...
  • educast
  • educast
  • 2013年10月27日 22:16
  • 5460

Boost.asio 一些注意事项

数据丢失的假象用buffer封装字符串时,要注意字符串末尾的'\0',如下:boost::asio::async_write(*sock, boost::asio::buffer("hello...
  • wdstudio
  • wdstudio
  • 2015年10月26日 12:41
  • 859

Boost在Windows上的配置以及的Boost::asio C/S同步例子

一、 下载boost boost.org http://www.boost.org/users/download/ boost_1_51_0.zip 下载并解压到C盘根文件夹 ...
  • hezijian22
  • hezijian22
  • 2014年11月29日 13:57
  • 1656

当ASIO::ASYNC_READ与SOCKET的ASYNC_READ_SOME的区别

当连接成功时做如下工作 1        asio::async_read(socket_, asio::buffer(&m_packet, sizeof(m_packet)), 2 ...
  • educast
  • educast
  • 2013年10月27日 09:49
  • 1836

boost::async_read_some连续接收数据

我在最近工作的时候用到了boost的http_server程序,这个http_server是一个框架用于接收并解析http协议。这个框架在接收get请求时没有任何问题,当接收post数据时,当数据大于...
  • z21558623
  • z21558623
  • 2017年02月16日 11:18
  • 242

Boost.Asio基本原理(CSDN也有Markdown了,好开森)

Boost.Asio基本原理 这一章涵盖了在使用Boost.Asio时必须知道的一些事情。我们也将深入研究比同步编程更复杂、更有乐趣的异步编程。...
  • mmoaay
  • mmoaay
  • 2016年02月24日 15:34
  • 11487
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:boost的asio中的read_util问题
举报原因:
原因补充:

(最多只允许输入30个字)