簡體   English   中英

如果我使用select()輪詢方法,我應該將套接字設置為非阻塞嗎?

[英]If I use select() polling method, should I set sockets to non-blocking?

我正在使用select()輪詢函數來確定何時有從套接字讀取的數據。 我這樣做,所以我不必依賴阻塞函數,如accept()和recv()。 由於select()阻塞直到文件句柄有數據,是否有必要使用fcntl()將套接字設置為非阻塞?

在我看來,沒有必要,因為select()函數告訴我數據已准備好從套接字文件句柄中讀取。

我已經看到程序員使用select()並且還將套接字設置為非阻塞的代碼,並且我已經看到程序員使用select並且已經保留阻塞設置的代碼。 哪個是對的? 使用select()並將套接字設置為非阻塞是否有優勢?

是的,您通常應該將套接字設置為非阻塞。 原因如下:

  • 寫入套接字時,您可以寫入套接字的事實並不一定意味着您可以在不阻塞的情況下將所有想要的內容寫入套接字。 因此,如果要向套接字寫入大量數據,則對套接字的寫入可能會阻塞,但套接字緩沖區只有較小的空間。

  • 從套接字讀取時,從套接字讀取數據的事實並不一定意味着將存在您想要的所有數據(盡管如果您這樣做,它將返回一個簡短的讀取)。

如果您一次只編寫或讀取一個字節,我想這將是一個例外,但這是一個罕見的例外。

暫無
暫無

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

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