簡體   English   中英

C - 套接字 - epoll。 什么與慢客戶?

[英]C - sockets - epoll. What with slow clients?

上下文

Debian64bits。

以為我理解套接字含義但不是。

擔心慢客戶的管理。

閱讀和擺弄該代碼epoll邊緣觸發

想象一下兩個客戶端:A:非常慢的網絡B:非常快的網絡。

在邊沿觸發模式下,當我們開始從A讀取然后B在發送A的讀取循環時還發送一些數據進行讀取時會發生什么?

B必須等待我們讀取來自A的所有數據嗎?

或者我們應該創建一個緩沖區(不是在給定的示例中)來存儲A數據並連接它們直到消息完成並立即返回?

或者這個緩沖區是否已由epoll管理?

基礎不清楚我..

無論網絡是否緩慢,只要讀取到目前為止已到達服務器的所有數據,讀取部分就會停止。

但是它有一個bug(或至少是一個可移植性問題)。 代碼僅在讀取數據時檢查EAGAIN 它還應該檢查EWOULDBLOCK ,因為一些平台在讀取所有數據后返回該錯誤代碼。

編輯:

好吧,如果我想將傳入的數據放入數據庫,我該如何管理呢? 我能讀取整個數據嗎?

如果您收到不完整的消息,則需要將其存儲,直到收到整個消息。 我會使用消息片段為每個傳入連接malloc一個char*

消息完成后,您可以處理它,將其存儲在數據庫中或任何您想要的內容中。

請注意,下一條消息的開頭可能已經可用,因此在獲得EWOULDBLOCKEAGAIN之前,您無法停止閱讀。

處理問題的另一種方法是為每個連接創建一個單獨的線程。 哪個approcah最好? 那么,這將取決於應用程序(同時用戶數等)。

暫無
暫無

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

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