libghttp库的使用心得
需要用到native程序上网接收文件到本地,需要的协议为http。
由于android本身自带的chrome太过复杂,调用起来也不方便。在网上搜索过后,移植了libhttp到本地。比较简单易用,但程序是否能很好的支持多线程,这个还需要继续了解。
一开始参考网上的代码写了一个,但总是发现文件有错乱。在仔细debug后,发现问题出在使用同步和异步获取文件的问题上。在开发前,并没有好好的去区分异步和同步,导致挖了个不小的坑。
一般在do{//写文件}while(1)中,一般选择使用同步的方式;
如果是set(callback)的方式,这时可以使用异步的方式。如果是异步的方式,一般涉及到对接收包的排序问题。异步的话,服务器压力最小。
下面是错误的调用方式,设置了异步方式,同时使用do while(1)结构。只要修改下代码中的协议方式即可。
楼主 发表于: 2012-06-09 11:24:23
我在使用libhttp 异步的请求一个10MB的数据,结果发现下载过来的文件会错乱,具体信息:(1)下载过来的文件大小是对的。还是10MB;(2)但是文件在中间某些地方会错乱。(3)代码如下:
int _tmain(int argc, _TCHAR* argv[]) { WORD wVersionRequested=MAKEWORD(1,1); WSADATA wsaData; if(WSAStartup(wVersionRequested,&wsaData)) { return -1; } char *uri = "http://127.0.0.1:81/123.flv"; FILE *txt = fopen("D:\\m123.flv","wb"); char *buf; ///异步请求 int bytes = 0; int recvbytes = 0; ghttp_request *request; ghttp_status req_status; request = ghttp_request_new(); ///分配一个新的request if (ghttp_set_uri(request,uri) < 0) bail("ghttp_set_uri"); if(ghttp_set_type(request, ghttp_type_get) < 0) bail("ghttp_set_type"); if (ghttp_set_sync(request, ghttp_async) < 0)///设置异步请求 bail("ghttp_set_sync"); if (ghttp_prepare(request) < 0) bail("ghttp_prepare"); do { status(request, "conn0"); req_status = ghttp_process(request); if (req_status == ghttp_error) { fprintf(stderr, "ghttp err: %s\n", ghttp_get_error(request)); return 2; } if (req_status != ghttp_error && ghttp_get_body_len(request) > 0) { buf = ghttp_get_body(request); bytes = ghttp_get_body_len(request); recvbytes += bytes; fwrite(buf,bytes,1,txt); ghttp_flush_response_buffer(request); } } while (req_status == ghttp_not_done); ///实验结果是接收数据大小完整,但是中间数据有错乱, ///怀疑是ghttp_flush_response_buffer(request);造成? fprintf(stderr, "conn0 received %d bytes\n", recvbytes); ghttp_clean(request); ghttp_request_destroy(request); fclose(txt); getch(); return 0; } 请大家帮忙分析一下原因,谢谢! |