簡體   English   中英

Epoll Epollin讀取數據

[英]Epoll epollin read data

在接受設置為偵聽EPOLLIN事件的連接套接字並得到EPOLLIN事件之后,使用EPOLLIN ,是否需要在epoll_ctlEPOLLOUT之前讀取所有數據(直到0 )?

示例:我有一個使用epoll的HTTP服務器,我只想讀取HTTP標頭( EPOLLINrecv ),直到\\r\\n\\r\\n為止。 我可以安全地忽略其余消息,而無需閱讀並切換到輸出(帶有send EPOLLOUT )嗎?

簡短的回答是,是安全的。 一些東西。

實際上,“讀取所有數據直到0”的選擇實際上是行不通的。 瀏覽器客戶端直到從服務器消耗掉響應后,才會關閉/關閉套接字的末端。 因此,您將拖延等待recv返回0,因為遠程客戶端仍在等待您響應。

假設您未使用邊沿觸發模式,則無需擔心會丟失任何通知,就可以了。 您可以僅使用帶有EPOLLIN通知和recv()的標頭,然后使用epoll_ctl套接字以僅接收EPOLLOUT通知。 完成發送響應后,安全的做法是切換回偵聽EPOLLIN通知(可能還包括EPOLLHUP和EPOLLRDHUP)以使用請求中的所有額外數據,直到客戶端關閉其套接字(在這種情況下recv將返回0) )。

也可以使用邊緣觸發模式。 只需確保使用非阻塞套接字,並在切換到響應模式時嘗試非阻塞發送,即使您沒有獲得初始EPOLLOUT。 當切換回閱讀模式時,請執行無阻塞接收,以防丟失早期的EPOLLIN。

如果某個啞巴的客戶端嘗試發送的不只是標頭(例如一長串POST數據字節),那么在某種程度上很有可能,客戶端可能直到嘗試完成發送后才嘗試接收響應。 這樣,您就陷入了虛擬僵局。 服務器和客戶端都無法向其套接字寫入其他字節,因為雙方都沒有讀取。 一個簡單的解決方案是確保在發送響應之前消耗整個請求(標頭和“ Content-Length”字節)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM