簡體   English   中英

套接字編程中的選擇函數

[英]Select function in socket programming

誰能告訴我select函數在c中socket編程中的使用和應用?

當您必須處理多個事件源時, select()函數允許您實現事件驅動的設計模式。

假設您想編寫一個程序來響應來自多個事件源的事件,例如網絡(通過套接字)、用戶輸入(通過標准輸入)、其他程序(通過管道)或任何其他可以由fd表示的事件源. 您可以啟動單獨的線程來處理每個事件源,但您必須管理線程並處理並發問題。 另一種選擇是使用一種機制,您可以將所有fd聚合到單個實體fdset ,然后調用一個函數來等待fdset 每當在任何fd上發生事件時,此函數都會返回。 您可以檢查事件發生在哪個fd上,讀取該fd ,處理事件並對其做出響應。 完成后,您將返回並坐在該等待函數中 - 直到某個fd上的另一個事件到達。

select工具就是這樣一種機制, select()函數就是等待函數。 您可以在任意數量的書籍和在線資源中找到有關如何使用它的詳細信息。

select函數允許您檢查幾個不同的套接字或管道(如果您不在 Windows 上,則可以檢查任何文件描述符),並根據哪個先准備好做一些事情。 更具體地說, select函數的參數分為三組:

  • 讀取:當該類別中的任何文件描述符准備好讀取時,select 會將它們返回給您。

  • 寫入:當此類別中的任何文件描述符准備好寫入時,select 會將它們返回給您。

  • 卓越:當任何這一類的文件描述符有一個特殊情況-也就是說,它們緊密不清潔,連接中斷或他們有一些其他錯誤- select將它們返還給您。

select的強大之處在於單個文件/套接字/管道功能通常是阻塞的。 Select 允許您監視多個不同文件描述符的活動,而不必為每個函數調用設置專用的程序線程。

為了讓您獲得更具體的答案,您可能不得不提及您正在使用哪種語言進行編程。我已嘗試在概念層面給出盡可能籠統的答案。

select() 是輪詢套接字以讀取新數據或打開 TCP 窗口寫入的低技術方式。 除非有一些令人信服的理由不這樣做,否則最好使用 poll() 或 epoll_wait()(如果您的平台有),以獲得更好的性能。

更多細節會很好,但我認為你指的是Java NIO的Selector.select()方法。

對您的問題的簡單回答是select()(在此上下文中)將等待一個通道(即,由此Selector對象管理的網絡連接之一)具有可讀取的數據。

當您同時打開許多連接時,許多/大多數將在任何給定時刻處於休眠狀態。 此方法/類允許您管理多個連接,而不必為該連接上的每個連接阻塞單獨使用。 您可以使用一個線程阻止多個連接,並且只需接收當前“准備好”的任何連接。

這是一個很棒的小教程,應該讓事情變得清晰:

http://rox-xmlrpc.sourceforge.net/niotut/

我喜歡gnu.org 上的描述

有時,程序需要在輸入到達時接受多個輸入通道上的輸入。 例如,某些工作站可能具有通過普通異步串行接口連接的數字化板、功能按鈕盒或撥號盒等設備; 良好的用戶界面風格需要立即響應任何設備上的輸入。 [...]

您通常不能為此目的使用read ,因為這會阻塞程序,直到某個特定文件描述符上的輸入可用; 其他通道上的輸入不會喚醒它。 您可以設置非阻塞模式並輪詢每個文件描述符,但這非常低效。

更好的解決方案是使用select函數。 這會阻塞程序,直到在一組指定的文件描述符上准備好輸入或輸出,或者直到計時器到期,以先到者為准。

根據 Linux 聯機幫助頁和 MSDN for Windows 的文檔,

select() 和 pselect() 允許程序監視多個文件描述符,等待一個或多個文件描述符“准備好”進行某類 I/O 操作(例如,可能的輸入)。 如果可以在不阻塞的情況下執行相應的 I/O 操作(例如 read(2)),則認為文件描述符已准備就緒。

簡單解釋一下:通常需要一個應用程序一次做多件事。 例如,您可能會在 Web 瀏覽器中訪問多個站點,Web 服務器可能希望同時為多個客戶端提供服務。 需要一種機制來監視每個套接字,以便應用程序不會忙於等待一個通信完成。

一個例子:想象一下在火車上旅行時在你的智能手機上下載一個大的 Facebook 頁面。 您的連接時斷時續且速度緩慢,在等待您的通信完成時,Web 服務器應該能夠處理其他客戶端。

暫無
暫無

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

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