2009年9月29日星期二

秒表

我的诺基亚手机没有秒表,总要找同事借,干脆自己写了一个


精度是 microsecond


#include <iostream>
#include "boost/date_time/posix_time/posix_time.hpp"

using namespace std;
using namespace boost::posix_time;

int main(void){
    ptime start, suspend;
    start = microsec_clock::local_time();
    while(getchar()){
        suspend = microsec_clock::local_time();
        cout<< suspend - start<<endl;
    }
    return 0;
}

然后

g++ timer.cpp -o timer.exe -Ie:\boost_1_39_0\ -O2 -Wall

2009年9月1日星期二

asio中的同步读写操作

写了个利用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了.