[英]C - sockets - epoll. What with slow clients?
Debian64bits。
以為我理解套接字含義但不是。
擔心慢客戶的管理。
閱讀和擺弄該代碼epoll邊緣觸發
想象一下兩個客戶端:A:非常慢的網絡B:非常快的網絡。
在邊沿觸發模式下,當我們開始從A讀取然后B在發送A的讀取循環時還發送一些數據進行讀取時會發生什么?
B必須等待我們讀取來自A的所有數據嗎?
或者我們應該創建一個緩沖區(不是在給定的示例中)來存儲A數據並連接它們直到消息完成並立即返回?
或者這個緩沖區是否已由epoll管理?
基礎不清楚我..
無論網絡是否緩慢,只要讀取到目前為止已到達服務器的所有數據,讀取部分就會停止。
但是它有一個bug(或至少是一個可移植性問題)。 代碼僅在讀取數據時檢查EAGAIN
。 它還應該檢查EWOULDBLOCK
,因為一些平台在讀取所有數據后返回該錯誤代碼。
編輯:
好吧,如果我想將傳入的數據放入數據庫,我該如何管理呢? 我能讀取整個數據嗎?
如果您收到不完整的消息,則需要將其存儲,直到收到整個消息。 我會使用消息片段為每個傳入連接malloc
一個char*
。
消息完成后,您可以處理它,將其存儲在數據庫中或任何您想要的內容中。
請注意,下一條消息的開頭可能已經可用,因此在獲得EWOULDBLOCK
或EAGAIN
之前,您無法停止閱讀。
處理問題的另一種方法是為每個連接創建一個單獨的線程。 哪個approcah最好? 那么,這將取決於應用程序(同時用戶數等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.