1.原因 由於最近對於非同步connect函數的測試,發現提前將一個套接字加入epoll監聽隊列會不斷爆出epollhup事件 2.示例 ........ iEpoll = epoll_create(1); iFd = socket(AF_INET, SOCK_STREAM, 0); stEvent. ...
1.原因
由於最近對於非同步connect函數的測試,發現提前將一個套接字加入epoll監聽隊列會不斷爆出epollhup事件
2.示例
........
iEpoll = epoll_create(1);
iFd = socket(AF_INET, SOCK_STREAM, 0);
stEvent.events = EPOLL_IN;
stEvent.data.u32 = iFd;
epoll_ctl(iEpoll, EPOLL_CTL_ADD, iFd, &stEvent);
i = epoll_wait(iEpoll, astEvent, 1, -1);
...................
3.調試
在該tcp套接字創建之後,還未建鏈,也並未listen,說明這種情況下不會有任何事件上報,那麼將這樣的一個套接字加入該listen隊列是錯誤的,但是epoll_ctl時加入卻是成功的,很讓人費解.即使後續的操作中有把該套接字connect或者listen,但是由於水平觸發事件的原因,之前的事件未被處理,將導致這個hup事件一直上報.
4.解決
以上分析說明將一個不可能觸發該事件發生髮生的套接字加入epoll,將會導致hup事件的上報,所以接到該事件時,一個辦法是將套接字移出epoll監聽隊列,另一個方法是,在connect操作之後或者在listen之後,再將該套接字加入epoll