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使用async_read_until配合boost::regex读取数据

1. 问题         很容易找到代码,boost::asio使用async_read_until配合boost::regex读取数据。但是却不知道怎么把数据从buf中读取出来。大部分示例中只有 ...

关于boost::asio::read_until()之后再boost::asio::read()可能出现的问题

这两日在工作中,发现当报文内容

关于BOOST的ASIO库的Socket最大连接数问题

最近偶尔学习下BOOST库,发现关于ASIO的应用还不是很多,大多都集中在Regx的讨论上。今天这里就ASIO的一个点发表一点讨论吧。 先在网上搜索了下关于ASIO的问题,发现有人反映说最多...

BOOST::ASIO多线程下socket关闭导致进程崩溃问题定位及解决

背景:         本系统为我公司开发的一套商用车车联网系统的网关子系统,采用C++基于BOOST库开发,网络开发库采用了BOOST的ASIO库,线程池采用了基于BOOST的ThreadPool...

boost的asio使用中的一个问题

前两天在测试用asio写的模块时发现,在高压力情况下,内存使用很大,而且涨上去之后在低压力情况下内存依然没降下来。一开始以为是内存泄露,后来用valgrind查了半天,发现根本没有内存泄露的代码。  ...

Boost.Asio cpp Network Programming

  • 2017-10-11 22:43
  • 1.47MB
  • 下载

C++ Post/Get请求(Boost.Asio库)

C++实现HTTP的Post/Get请求。代码跨平台。

boost asio 最新版

  • 2017-05-09 17:05
  • 935KB
  • 下载

Boost_Asio

  • 2013-03-22 14:57
  • 7.45MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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