写了个利用sina的股票接口读取实时股票信息的程序,练习一下boost::asio的使用.
现阶段我用到的只是里面最简单的同步读写接口,异步方面的还用不上.
当时主要是卡在了asio::read, asio::read_until, ip::tcp::socket::read_some这几个读操作上面了.
最初我是直接把asio::read放到一个while循环里面
while(boost::asio::read(connfd, response_, boost::asio::transfer_at_least(1), error)){
......
}
一直读到无数据可读为止.
后来看到那个可怜的文档里面还有一个completion condition叫transfer_all(),可以不用循环一次读完数据
boost::asio::read(connfd, response_, boost::asio::transfer_all(), error)
但是这两种都会在判断"至少还有一个字节",或者"读完所有"上面等待很长时间.去邮件列表问了,也不知道为什么.只好换一个方法.
还有一个read_until,但是我要读的是个http包,没办法知道最后要读到什么限定符为止.
ip::tcp::socket类有个成员方法是read_some,用来读指定字节的数据.
我最终的方法是用read_until读完全部的http头,取得后面http包的字节数.然后就能用read_some读取指定字节数了.
但是这地方有个问题.
read_until读取的数据要比指定限定符位置的更多.调用完read_until之后需要把读取出来的限定符之后的数据都倒出来,
放到read_some里面的Content-Length参数也需要减去相应的字节数.因为这部分数据已经在read_until操作中读出来了.
处理完数据,取好剩余字节长度,就可以调用read_some了.
没有评论:
发表评论