epoll ET mode with tcp nonblocking socket(linux kernel 2.6.18)
[b]现假设A, B建立了tcp连接,且A可写[/b]
1) 2.6.18并未实现真正意义上的 edge triggered, 事件会报多次,比如socket可写,这时tcp接收到有5bytes,触发EPOLLIN | EPOLLOUT,不管应用层是否read()掉这5bytes,然后又接收到10bytes又会触发EPOLLIN | EPOLLOUT;也就是只要触发一个事件其它满足条件的事件还是会返回即使以前报告过。感觉内核是根据这个socket的状态取的这些事件
2) epoll_ctl(, EPOLL_CTL_ADD, ,)会去检查对应socket的状态,如果需要监视的某个event已经满足返回的条件,则第一次调用epoll_wait会返回该event
3) A shutdown(, SHUT_RD)不会给B发送任何tcp报文,这之后B再write()过来A也不会给B发送RST或则其它断开连接的报文,B 的epoll_wait不会返回任何事件;
4) A shutdown(, SHUT_RD)后,A的epoll_wait()立即返回EPOLLIN EPOLLOUT EPOLLRDHUP,A还可以继续read()该socket,有数据则读出,否则read()返回0
5) A shutdown(, SHUT_WR),则向B发送FIN报文,导致B的epoll_wait()返回:EPOLLIN | EPOLLOUT | EPOLLRDHUP,这之后如果A再close()该socket,B不会触发任何事件
6) A close()该socket,如果A 的tcp接收缓冲区还有数据,则向B发送RST报文,导致B的epoll_wait()返回:EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLRDHUP
7) A close()该socket,如果A 的tcp缓冲区没有数据,则向B发送FIN报文,导致B的epoll_wait()返回:EPOLLIN | EPOLLOUT | EPOLLRDHUP
8) B shutdown(, SHUT_WR)如果B的缓冲区还有数据,则B 的epoll_wait()马上返回EPOLLIN,如果无数据则不返回。
9) B shutdown(, SHUT_RD)导致B 的epoll_wait()马上返回EPOLLIN EPOLLOUT EPOLLRDHUP而不管B的tcp缓冲区中是否有数据。
10) B shutdown(, SHUT_RD | WR)如果B的缓冲区还有数据,则B 的epoll_wait()马上返回EPOLLIN,如果无数据则不返回。
11) tcp连接关闭(A和B均用shutdown(, WR))导致epoll_wait返回EPOLLIN EPOLLHUP EPOLLRDHUP
[[i] 本帖最后由 学与思 于 2010-1-22 17:04 编辑 [/i]]
epoll ET mode with tcp nonblocking socket
最新推荐文章于 2024-07-25 18:05:44 发布