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]]