上次想做个airticket航班查询的接口,结果失败。
不甘失败,从上周5开始,连续搞到现在,花了4天的工夫。终于出了点成绩。
fsockopen打开一个连接,然后请求。比如要反复请求5次
for($i=0;$i<5;$i++){
fputs($socket,$req);
...................xxx这里是你怎么读返回的数据?用while(!feof)和手册上的do strlen都只能得到第一次的请求。
}
我来告诉你原因。
fread和fgets都是读到EOF标记都返回的。如果用!feof那么第一次请求的数据读完后。EOF的标记
就被设为真了。然后你不是又收到一些数据了吗?呵呵,系统可不管你现在的指针位置是不是还是结尾。EOF就是真。不会变了。所以接下来fread和fgets统统都膈毙。
所以怎么办?fread可以小心地不超过阅读界限,从而不会触发EOF标记。呵呵。所以接下来就是让
fread小心地控制,不要超过了阅读的边界。因为一旦超过边界,EOF就被设置为真,要是这样神仙也挽救不了你。就是唠叨老大亲自出马也救不了你了。
不就是控制嘛,呵呵。
首先我们得了解IIS和Apache返回的数据格式,得得到返回的字节数目,不然,控制也就无从谈起了。从哪里得到呢?还好IIS返回的头部通常都有一个Content-length让你爽。不过apache的返回格式就头疼了。
我反复地试验,最后发现,大于8192字节的时候,apache的数据字节数不是在头部的,头部没有Content-length.而是这样,apache把需要返回的数据一个一个包地发给你。而每个包的长度就包含在此包的第一行。这个是今天下午才发现的。所以接下来就是处理细节了。
我写了一个类。ok。问题ok了。
12-9
今天终于把查询接口做出来了。查询如果不带viewstate,.net会报错。
带上viewstate。结果是发送的表单变得狂大。几乎20K。
。查询在waiting.aspx的时候就开始了。query.aspx只是显示结果而已。
不甘失败,从上周5开始,连续搞到现在,花了4天的工夫。终于出了点成绩。
fsockopen打开一个连接,然后请求。比如要反复请求5次
for($i=0;$i<5;$i++){
fputs($socket,$req);
...................xxx这里是你怎么读返回的数据?用while(!feof)和手册上的do strlen都只能得到第一次的请求。
}
我来告诉你原因。
fread和fgets都是读到EOF标记都返回的。如果用!feof那么第一次请求的数据读完后。EOF的标记
就被设为真了。然后你不是又收到一些数据了吗?呵呵,系统可不管你现在的指针位置是不是还是结尾。EOF就是真。不会变了。所以接下来fread和fgets统统都膈毙。
所以怎么办?fread可以小心地不超过阅读界限,从而不会触发EOF标记。呵呵。所以接下来就是让
fread小心地控制,不要超过了阅读的边界。因为一旦超过边界,EOF就被设置为真,要是这样神仙也挽救不了你。就是唠叨老大亲自出马也救不了你了。
不就是控制嘛,呵呵。
首先我们得了解IIS和Apache返回的数据格式,得得到返回的字节数目,不然,控制也就无从谈起了。从哪里得到呢?还好IIS返回的头部通常都有一个Content-length让你爽。不过apache的返回格式就头疼了。
我反复地试验,最后发现,大于8192字节的时候,apache的数据字节数不是在头部的,头部没有Content-length.而是这样,apache把需要返回的数据一个一个包地发给你。而每个包的长度就包含在此包的第一行。这个是今天下午才发现的。所以接下来就是处理细节了。
我写了一个类。ok。问题ok了。
12-9
今天终于把查询接口做出来了。查询如果不带viewstate,.net会报错。
带上viewstate。结果是发送的表单变得狂大。几乎20K。
。查询在waiting.aspx的时候就开始了。query.aspx只是显示结果而已。