libevent的一些知识

来源:互联网 发布:联想y700显卡设置优化 编辑:程序博客网 时间:2024/05/01 17:08

1、什么动作会触发EV_READ, 什么动作触发EV_WRITE?
2、为什么connection_accept()的eventflag有EV_PERSIST,而connection_time的没有?

通过查资料,终于搞明白了!
在《UNIX网络编程第1卷(第2版)》第6章 “I/O 复用:select和poll函数”(129页),有解释:

===============
描述字符在什么条件下准备好?
1、下列的4个条件中的任何一个满足时,socket准备好读(即有EV_READ):
a)套接口接收缓冲区中的数据字节大于等于套接口接收缓冲区低潮限度的当前值(可以设定,默认为1)
b)连接的读这一半关闭(即收到了FIN的TCP连接)。(也就是读到结尾了)
c)套接口是一个接听套接口且已完成的连接数为非0。
d)有一个套接口错误待处理。
2、下列的3个条件中的任何一个满足时,socket准备好写(即有EV_WRITE):
a)套接口发送缓冲区中的数据字节大于等于套接口发送缓冲区低潮限度的当前值(可以设定,默认为2048),且:
aa)套接口已连接 或 bb)套接口不需要连接(如UDP)
b)连接的写这一半关闭。
c)有一个套接口错误待处理。
===============

根据刚才的time server中的例程,当client有socket连上来,应该是EV_READ,因为满足1中的c“套接口是一个接听套接口且已完成的连接数为非0”,当该连接被acept以后,就有EV_WRITE了,因为它满足2中的a“套接口发送缓冲区中的数据字节大于等于套接口发送缓冲区低潮限度的当前值,且套接口已连接”。所以,event_set的时候,EV_READ是有人连上来,回调函数是connection_accept(),而EV_WRITE是在accept以后。

那EV_PERSIST呢?
EV_PERSIST,是在event发生了以后,不从队列中拿开,就是下次再有这个消息的时候,继续调那个回调函数,知道程序主动调用了event_del后,才从队列中删除--就算有那个消息也不回调函数。
connection_accept函数,只要有连接上来,就要调用的,所以它需要设置为EV_PERSIST。
但connection_time函数,用途是在client连上来以后,给client一个返回,然后就断开连接。那它必须在连接连上了以后,只做一次,所以不需要设置为EV_PERSIST,而且必须在accept中设置--如果没有accept就算有EV_WRITE也不应该调用它啊。

原创粉丝点击