【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,資料庫無法連線,導致的程序無法啟動問題處理資料庫
- 重置資料庫密碼後導致網站無法訪問資料庫密碼網站
- Oracle資料傾斜導致的問題-無繫結變數Oracle變數
- 使用資料庫處理併發可能導致的問題資料庫
- 因為跨域問題導致的無法讀取 response header跨域Header
- DevExpress 的LayoutControl控制元件導致資源無法釋放的問題處理devExpress控制元件
- 在settings加入AUTHENTICATION_BACKENDS設定導致root使用者無法登入問題
- 使用axios post 請求資料無法提交的問題iOS
- 磁碟IO故障導致的SQLServer資料庫無法寫入SQLServer資料庫
- ant design 中,使用dva/fetch 設定導致無法從後臺匯出excel的問題Excel
- ORACLE DSG資料同步軟體程式導致資料庫無法正常關閉Oracle資料庫
- 未使用 `deleteLater` 而直接使用 `delete` 導致問題delete
- 懷疑私網網路卡多播問題導致crs無法正常啟動
- 前後端頁面分離導致session無法正常獲取的問題後端Session
- Linux 作業系統指令碼格式問題導致指令碼無法執行Linux作業系統指令碼
- golang slice使用不慎導致的問題Golang
- Laravel artisan 寫入日誌的使用者和 fpm 不一致,導致無法寫入日誌問題Laravel
- 【伺服器資料恢復】VSAN故障導致虛擬機器無法訪問的資料恢復案例伺服器資料恢復虛擬機
- 伺服器意外斷電導致無法重啟資料恢復伺服器資料恢復
- 資料庫不使用悲觀鎖導致問題的一種復現方式資料庫
- 什麼是資料洩露?哪些問題可導致資料洩露
- nfs導致的作業系統目錄無法訪問NFS作業系統
- 【linux】【docker】Docker預設網段配置導致無法訪問LinuxDocker
- Python3.7.0 SSL低版本導致Pip無法使用Python
- 關於 iconv 轉碼導致資料丟失的問題
- VMware Fusion 13無法使用問題
- wpf popup導致MouseLeftButtonUp無法觸發
- [問題] jenkin 伺服器和專案不在一臺伺服器,導致 allure report 外掛無法使用伺服器
- HTTP 請求中 Token 引數帶引號導致後臺無法識別問題HTTP
- centos6.3誤刪python2.6導致yum無法使用CentOSPython
- Mac升級至macOS High Sierra後導致git無法使用MacGit
- 【伺服器資料恢復】Raid5癱瘓導致上層lun無法使用的資料恢復案例伺服器資料恢復AI
- Oracle資料傾斜導致的問題-有繫結變數Oracle變數
- Chrome89針對sessionStorage的更新導致資料共享問題ChromeSession
- 解決無法使用VI的問題
- 淘寶映象cnpm無法使用問題NPM
- 伺服器資料恢復—nas儲存硬碟出現故障離線導致無法訪問的資料恢復案例伺服器資料恢復硬碟
- 伺服器資料恢復-VSAN節點掉線導致虛擬機器無法訪問的資料恢復方案伺服器資料恢復虛擬機