2012-09-06 15:54:10| 分類: network_program
| 標籤:
epoll
c |舉報 |字型大小
訂閱
我的**書 |
一、超時實驗
建立乙個阻塞模式的tcp連線到乙個沒有監聽的服務埠(肯定連不上,然後等待超時),然後將這個socket描述符,交由epoll管理。註冊的epoll事件為
event = epollin | epollout | epollrdhup | epollerr | epollet |
epollpri | epollhup
結果:當tcp連線超時的時候,觸發的事件有epollin 、 epollout 、epollrdhup 、 epollerr、epollhup,也就是只有緊急資料的事件沒有發生。
二、呼叫read(),返回0時,繼續write()
建立乙個阻塞模式的tcp連線到有監聽的伺服器端口上,然後將這個socket描述符,交由epoll管理。註冊的epoll事件為
event = epollin | epollout | epollrdhup | epollerr | epollet |
epollpri | epollhup
當該描述符可寫時,寫10位元組的資料到服務端;當該描述符可讀時,讀10位元組的資料;服務端讀10位元組的資料,然後休眠5秒,之後close連線。
實驗結果,總結如下:
1, tcp三次握手一旦完成,該socket描述符的epollout觸發,即可寫
2, 服務端休眠5秒後,關閉連線。觸發的事件有epollin 、 epollout 、epollrdhup 、 epollerr、epollhup。此時read返回0,write仍然可寫
3, 之後又觸發了epollin 、 epollout事件。此時read仍然返回0,write出錯,錯誤為sigpipe。這次觸發的原因是,在2中的write了乙個closed的連線,由於非阻塞,造成write成功的假象,所以這兒epoll又接到了通知,彌補上一步的錯誤。
三、呼叫read,返回0,不再write
建立乙個阻塞模式的tcp連線到有監聽的伺服器端口上,然後將這個socket描述符,交由epoll管理。註冊的epoll事件為
event = epollin | epollout | epollrdhup | epollerr | epollet |
epollpri | epollhup
當read返回0後,不再write資料到服務端;服務端讀10位元組的資料,然後休眠5秒,之後close連線。
實驗結果:
1, tcp三次握手一旦完成,該socket描述符的epollout觸發,即可寫
2, 觸發epollin 、 epollout 、epollrdhup 、 epollerr、epollhup。此時read返回0。之後不再有事件觸發
四、在et模式下,只需註冊epollin | epollout就可以了,如果有錯誤發生,這兩個事件也被能觸發,然後判斷錯誤型別就可以了
epoll特點總結
2.1 ppc tpc模型 這兩個模型就是有個連線來了就給分配個程序 執行緒,前者肯定更費資源了,因為這麼多程序 執行緒不是吃素的,都要時間和空間,開銷大,所以併發只有幾百?也沒說epoll 是如何分配的?也就是說那兩個得遍歷所有,和連線數有關!epoll也遍歷,但是只遍歷活躍的所以效率高。強調實際...
epoll使用總結
epoll的使用總結 使用epoll來實現乙個tcp server,中間碰到了不少使用細節上的問題,總結一下。man epoll裡推薦的使用方法 define max events 10 struct epoll event ev,events max events intlisten sock,c...
epoll之二 epoll實戰
int epoll create int size epoll create返回 乙個控制代碼,之後epoll的 使用都將依靠這個 控制代碼 來 標識,引數 size是告訴epoll所要處理的大致事件數目,不再使用epoll時,必須呼叫close 關閉這個控制代碼。size這個引數只是 告訴核心這個...