怎么快速学习开源库比如libevent

>> 学习libevent和webserver的利器 > 源码下载
学习libevent和webserver的利器
(1,007.63 kB) 源码下载
!为更好的服务用户,近期我们对网站进行了升级改版。请前往新版下载页下载此代码。
Sponsored links
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
Sponsored links
亲,您的积分不够了! ^_^|||
快速获得积分 (支付宝快速到账,网银实时到账) :
10 个积分 (下载点数)100.00人民币
22 个积分 (下载点数)200.00人民币
55 个积分 (下载点数)500.00人民币
120 个积分 (下载点数)1000.00人民币
免费获得积分 :
通过您的分享链接,每来访2个IP您将获得0.1积分。
通过您的分享链接,每注册一个用户,该用户每得1积分,您将获得0.2积分分成。
上传您的代码,最多可获得10积分!
鲁ICP备号-2 runtime:Elapsed:41.924ms 27.69
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧开源库(1)
&&& 可以说对于任何网络库(模块)而言,一个缓冲模块都是必不可少的。缓冲模块主要用于缓冲从网络接收到的数据,以及
用户提交的数据(用于发送)。很多时候,我们还需要将网络模块层(非TCP层)的这些缓冲数据拷贝到用户层,而这些内存拷贝
都会消耗时间。
&&& 在这里,我简要分析下libevent的相关代码(event.h和buffer.c)。
&&& 关于libevent的缓冲模块,主要就是围绕evbuffer结构体展开。先看下evbuffer的定义:
struct&evbuffer{
&&//&当前有效缓冲区的内存起始地址
&u_char&*&
&&//&整个分配(realloc)用来缓冲的内存起始地址
&&u_char&*orig_&
&&//&origin_buffer和buffer之间的字节数
&&//&整个分配用来缓冲的内存字节数
&&//&当前有效缓冲区的长度(字节数)
&&//回到函数,当缓冲区有变化的时候会被调用
&void&(*cb)(struct&evbuffer&*,&size_t,&size_t,&void&*);
&&//回调函数的参数
libevent的缓冲是一个连续的内存区域,其处理数据的方式(写数据和读数据)更像一个队列操作方式:从后写入,从前
读出。evbuffer分别设置相关指针(一个指标)用于指示读出位置和写入位置。其大致结构如图:
&& &orig_buffer指向由realloc分配的连续内存区域,buffer指向有效数据的内存区域,totallen表示orig_buffer指向的内存
区域的大小,misalign表示buffer相对于orig_buffer的偏移,off表示有效数据的长度。
&&& 这里我将结合具体的代码分析libevent是如何操作上面那个队列式的evbuffer的,先看一些辅助函数:
void&evbuffer_drain(struct&evbuffer&*buf,&size_t&len)
&该函数主要操作一些指标,当每次从evbuffer里读取数据时,libevent便会将buffer指针后移,同时增大misalign,减小off,
而该函数正是做这件事的。说白了,该函数就是用于调整缓冲队列的前向指标。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43125次
积分:1393
积分:1393
排名:千里之外
原创:94篇
转载:35篇
(1)(2)(2)(1)(1)(1)(3)(1)(1)(2)(2)(2)(4)(4)(1)(2)(6)(7)(3)(9)(6)(18)(18)(13)(4)(4)(3)(9)首先翻译下里的一段文章
对异步IO的一个简要介绍
大多数应用程序都是阻塞的IO调用,如果IO调用是同步(阻塞)的,它不能立即返回直到它的操作完成,或者经过了很长时间直到网络栈丢弃。当你在一个TCP连接上调用”connect()”时,例如,你的操作系统从TCP连接的另一端主机排队等待一个SYN包时。它不能立即返回你的应用程序,直到从连接的另一端主机收到SYN&ACK包,或者经历了足够的时候,驱动层丢弃。
libevent简要介绍
Libevent是一个轻量级的开源高性能网络库。
Libevent特点:&(来自&)
(1)事件驱动(event-driven),高性能;
(2)轻量级,专注于网络,不如&ACE&那么臃肿庞大;&
(3)源代码相当精炼、易读
(4)跨平台,支持&Windows、Linux、*BSD和&Mac&Os;&
(5)支持多种&I/O多路复用技术,epoll、poll、dev/poll、select&和kqueue&等;&
(6)支持&I/O,定时器和信号等事件;&
(7)注册事件优先级;&
&Libevent&已经被广泛的应用,作为底层的网络库;比如&memcached、&Vomi&t、&Nylon、&Netchat等等。
至目前为止资料也看了一部分,源码也看了一部分,我觉得研究源码,查资料,分析源码都很重要,但是最关键的是做demo分析demo。
现在想使用libevent做一个服务端的程序,结合之前使用epoll做的客户端程序做测试。
刚开始的时候在网上找了一个demo,结果编译不过,折腾半天还是放弃了。
郁闷了半天,找到一个例子不错,分享出来,我自己分析了下,修改了一些细节然后加了些注释,代码来源于:&(尊重原创)
对了,这里不在陈述libevent的安装,之前在研究memcache里有相应的介绍,链接:
其实安装基本都是./configure&–prefix=路径,然后make&&&&make&install就可以了
服务端demo代码:libevent_server.c
gcc&-I/usr/include&-o&123&libevent_server.c&-L/usr/local/lib&-levent
注意这里应该是包含文件的路径和库文件的路径加上去,具体路径取决于安装目录
测试1::将客户端的并发数设置为2,查看运行结果
测试2:将客户端的并发数设置为10000,(如果没有修改内核,需要修改句柄的最大数,ulimit&–n&65535)查看端口占用结果:
lsof&–i:8000&&log
grep&“TCP&localhost.localdomain”&log&|wc&–l&查看端口占用20001,结果正确,测试成功。
转载出处:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9408569次
积分:42231
积分:42231
排名:第58名
原创:672篇
转载:1937篇
评论:438条
(2)(30)(19)(19)(16)(1)(9)(7)(19)(13)(9)(4)(5)(28)(12)(34)(5)(3)(13)(27)(18)(11)(3)(23)(24)(31)(42)(12)(34)(19)(37)(41)(39)(56)(146)(66)(78)(78)(6)(15)(28)(26)(17)(57)(46)(25)(41)(24)(37)(70)(73)(28)(31)(35)(49)(54)(27)(25)(16)(21)(13)(24)(26)(35)(31)(27)(6)(6)(2)(3)(3)(7)(5)(10)(4)(9)(3)(2)(12)(11)(23)(5)(1)(9)(16)(11)(14)(4)(4)(28)(17)(37)(413)(2)(7)(1)(3)(4)(7)(6)(10)(28)(9)(6)我个人很倾向用著名的开源软件来完成功能需求,但是发现在实际开展中很多人会反对开源,而要求自己实现一套,我不知道是我考虑太少,还是他们太武断。
现在经济条件好了,出去吃顿饭很正常,餐馆花样也很多。但是很多人还是喜欢自己做的口味。这并不表示外面做的不好吃。
首先,希望LZ有这个意识:所有的工具都是为了帮助人类解决问题的,所以解决问题才是这些人发明不同的轮子的根本原因。&br&&br&所以我认为LZ其实忽略了一个事实,也就是你看起来这些库解决的是同一个问题,所以你才会觉得是浪费,但实际上,&b&这些不同的解决方案解决的不是同一个问题,至少不完全是一个问题。&/b&&br&&br&那么接下来问题就变成了“为什么这些解决方案解决的不是同一个问题呢?”在这一点上,我同意&a class=&member_mention& data-editable=&true& data-title=&@陈硕& data-hash=&c1c892f179f95da8b37a1dcc& href=&///people/c1c892f179f95da8b37a1dcc& data-hovercard=&p$b$c1c892f179f95da8b37a1dcc&&@陈硕&/a& 的观点,但是我觉得他没有说全,所以想补充一点说明,也就是我们该怎么评价&b&通用性&/b&和&b&针对性&/b&这两种针对解决问题思路。&br&&br&一般来说,&b&通用性解决方案的好处在于他有着较大的适用范围;但是缺点是在特定的场景下表现会退化&/b&,或者要实现如此的全能体验需要付出很大的代价(例如很笨重、耗费大量的内存等等)。举个现实中的例子,羊角锤(不是老罗的那个锤子OS哦)作为一个很通用的工具,可以用来敲钉子,可以用来起钉子,但是如果你用它敲堵墙试试?肯定能敲,但是估计LZ会累死吧。&b&而针对性解决方案的好处在于他可以在特定场景下较好满足用户的需求,但是缺点是这种场景可能是考虑不完的,也就是只能适应特定的场合。&/b&&br&&br&&br&最后再举个网游角色的例子来结束:你是把角色的属性点全部放在一个方面来剑走偏锋;还是每个方面放一些属性点来全面发展,这完全取决于你的爱好(也就是你的需求):-)
首先,希望LZ有这个意识:所有的工具都是为了帮助人类解决问题的,所以解决问题才是这些人发明不同的轮子的根本原因。 所以我认为LZ其实忽略了一个事实,也就是你看起来这些库解决的是同一个问题,所以你才会觉得是浪费,但实际上,这些不同的解决方案解决…
"著名"和"开源"都正确,"高性能"则不见得。这两个都是跨平台的功能丰富的网络库,代码量都在几万行,吃不透的话你敢用在产品代码中吗?&br&而专注某一平台(Linux)的性能更高的网络库只要5千行代码,几天就看下来了。&br&我见过的技术实力雄厚的公司都是自己写网络库的,而且都写得比libevent和asio更好。
"著名"和"开源"都正确,"高性能"则不见得。这两个都是跨平台的功能丰富的网络库,代码量都在几万行,吃不透的话你敢用在产品代码中吗? 而专注某一平台(Linux)的性能更高的网络库只要5千行代码,几天就看下来了。 我见过的技术实力雄厚的公司都是自…
已有帐号?
无法登录?
社交帐号登录
图形开发工程师

我要回帖

 

随机推荐