epoll ET mode with tcp nonblocking socket

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.