使用Libevent在Windows上搭建HTTP Server

因项目需求要在PC端搭建Http Server,让APP端可以在线浏览图片或者观看视频。因此就用上了libevent,至于libevent 和libev的区别,它们各有优势,这儿不再做阐述了。
今天主要讲讲在使用Libevent打开下载大文件时所遇到的问题,最开始用的是http-server.c里面的示例程序,它里面有两点是需要非常注意的:
1、它使用的是struct stat st,fstat函数来获取文件的大小,st.st_size类型为long.在我win10 64位系统上,它的最大值为2G。这样明显不能支持功能。
2、它使用evbuffer_add_file来读取文件内容到buffer中,这个大文件有一定隐患,它会导致内存分配不是每次都能分配成功,这样就会导致读取文件内容失败。
基于以上的问题,我们来一一解决,以及在解决过程所以遇到的问题。
对于文件大小的获取的限制,我使用的是CreateFile和 GetFileSize来获取文件大小,GetFileSize的第二个参数非常重要,根据MSDN的描述,当将变量作为参数传入,返回的是文件大小的高32位,文件的低32位作为函数的返回值。简单示例代码如下:

		ULARGE_INTEGER tInt1;
		tInt1.LowPart = GetFileSize(hFile, &tInt1.HighPart);
		long long FileLength = tInt1.HighPart;
		FileLength = FileLength << 32;
		FileLength += tInt1.LowPart;

这样文件大小类型为long long型,足以可以获取任何文件的大小了。
http-server.c示例使用的evbuffer_add_file和evhttp_send_reply来将文件内容一次性返回。后面了解到evhttp_send_reply_start|chunk|end这一系列函数,它的思路是server返回开始返回内容的动作,之后分块读取文件的内容返回,最后告知读取完成。最开始我参照此文的解决方法添加链接描述,此方法在在线浏览文件没有问题,但在下载保存文件时,始终保存文件不完整,但调试看看读取文件的大小的及读取文件的次数*块大小都是正确的,百思不得其解,一切看起来都是正常的,为什么下载文件就不完整呢?
这个问题困扰我两天,直到偶然看到一个函数evhttp_send_reply_chunk_with_cb,我瞬间就知道,这就是我要找的答案。后来查看libevent手册,上面讲的是evhttp_send_reply_chunk_with_cb当当前的块发送完成后触发回调函数。那一切都讲得通了,evhttp_send_reply_chunk有部分内容丢失了。
我的问题解决了,程序也运行完好,写这篇文章的目的一个是关于evhttp_send_reply_chunk_with_cb的介绍太少,不易能找到。二是提醒自己对于不熟悉的库,首要确定思路,要多翻翻手册,熟悉它的函数介绍。

我将完整能运行完好的代码打包上传,欢迎大家一同来学习。
附件:HTTPServerDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值