【epoll問題】EPOLLRDHUP使用導致無法接受資料
EPOLLRDHUP
問題:
客戶端關閉連結時
原來的操作是程式碼層操作,即 觸發EPOLLIN,recv返回0,關閉套接字即可。
現在,使用EPOLLRDHUP狀態,當客戶端傳送資料後立馬關閉,(呼叫close(sockfd)),伺服器無法接受資料,直接關閉。
程式碼如下:
if(events[i].events & EPOLLRDHUP
|| events[i].events & EPOLLHUP
|| events[i].events & EPOLLERR)
{
epoll(epollFd, EPOLL_CTL_DEL, clientFd, NULL);
close(clientFd);
}
對程式碼進行修改:
if( !(events[i].events & EPOLLIN)
&&( events[i].events & EPOLLRDHUP
|| events[i].events & EPOLLHUP
|| events[i].events & EPOLLERR))
{
epoll(epollFd, EPOLL_CTL_DEL, clientFd, NULL);
close(clientFd);
}
會導致一直recv返回0,還是無法接受資料。
參考該篇博文:https://blog.csdn.net/c1520006273/article/details/50439019
結論:
EPOLLIN = 0x0001
EPOLLRDHUP = 0x2000
對端連線斷開觸發的epoll事件會包含EPOLLIN | EPOLLRDHUP,即0x2001
採用以下三種方法,實驗都失敗了
1)在接收到EPOLLRDHUP 訊號時,應該先recv,然後再關閉
-> 觸發EPOLLRDHUP的訊號,列印出來是0x2001,然後觸發EPOLLIN,但是recv會返回0,並沒有先接收資料(recv >0),然後再recv = 0
2)或者在傳送客戶端設定SO_LINGER選項,等緩衝區資料傳輸完畢後關閉
-> 並不能帶來sleep的效果(客戶端sleep(5)可以實現伺服器端正常接收)
3)調換錯誤檢測和輸入檢測的順序,即先檢測是否EPOLLIN,然後檢測EPOLLRDHUP
-> recv < 0
同一個世界 同一個問題
https://stackoverflow.com/questions/27175281/epollrdhup-not-reliable
相關文章
- 歸檔問題導致的資料庫無法啟動資料庫
- 應用使用JNDI,資料庫無法連線,導致的程序無法啟動問題處理資料庫
- 字元校驗集問題導致索引無法正常使用字元索引
- memory_target設定不當導致資料庫無法啟動的問題資料庫
- ajax的get請求快取導致無法更新問題快取
- 解決hyper v導致docker無法啟動問題Docker
- 使用impdp不當導致的資料丟失問題
- Oracle資料傾斜導致的問題-無繫結變數Oracle變數
- 11gRAC許可權問題導致的叢集及資料庫無法啟動資料庫
- 使用資料庫處理併發可能導致的問題資料庫
- jdk版本導致tomcat,eclipse無法啟動的問題JDKTomcatEclipse
- Kubernetes node的防火牆問題導致pod ip無法訪問防火牆
- HA異常導致oracle資料庫無法啟動Oracle資料庫
- ORACLE資料檔名導致的奇怪問題Oracle
- 修改計算機名後導致Oracle無法訪問的問題修復計算機Oracle
- 因為跨域問題導致的無法讀取 response header跨域Header
- 磁碟IO故障導致的SQLServer資料庫無法寫入SQLServer資料庫
- 誤修改ORACLE_HOME導致無法登陸資料庫Oracle資料庫
- UNDO表空間損壞導致資料庫無法OPEN資料庫
- 修改SQLNET.ORA導致資料庫無法啟動SQL資料庫
- Linux下共享庫問題導致無法啟動SQLPLUS的問題解決LinuxSQL
- Oracle資料庫導致效能問題的可能原因Oracle資料庫
- memlock過低導致的資料庫效能問題資料庫
- 非歸檔模式下異常斷電導致的資料庫無法啟動的問題修復模式資料庫
- Discuz使用tools修復資料檔案後,訪問URL多出/source/plugin/tools,導致文章欄目無法訪問Plugin
- ORACLE DSG資料同步軟體程式導致資料庫無法正常關閉Oracle資料庫
- 真是鬱悶,因公司資料庫是國產的導致H技術無法使用資料庫
- oracle SGA設定過大導致資料庫無法啟動Oracle資料庫
- 歸檔日誌無法歸檔導致資料庫hang住資料庫
- 大量"library cache lock"事件導致資料庫無法連線事件資料庫
- iOS 10 不提示「是否允許應用訪問資料」,導致應用無法使用的解決方案iOS
- Workstation服務無法啟動導致無法訪問檔案伺服器伺服器
- 使用axios post 請求資料無法提交的問題iOS
- ChromeHSTS異常導致無法訪問HTTPS網頁ChromeHTTP網頁
- 資料庫預設安裝配置導致的問題資料庫
- 懷疑私網網路卡多播問題導致crs無法正常啟動
- 前後端頁面分離導致session無法正常獲取的問題後端Session
- TSM配置不好導致備份不正常,從而導致資料庫效能問題資料庫