select函數用法簡單總結

在Linux中我們可以通過man + 函數名, 命令查看Linux編程手冊從而查看一個函數的具體用法。

select函數原型爲:

 int select(int nfds, fd_set *readfds, fd_set *writefds,    fd_set *exceptfds, struct timeval *timeout);

需要包含的頭文件有:

 #include <sys/select.h>

 /* According to earlier standards */
 #include <sys/time.h>
 #include <sys/types.h>
 #include <unistd.h>

其中個參數總結如下:

  • nfds : 當前所有集合中最大的描述符值
  • readfds: 探測可讀描述符值
  • writefds:探測可寫描述符值
  • exceptfds:探測異常描述符集合
  • timeout:等待超時時間 0 , 0–非阻塞,NULL 永久阻塞

同時在手冊中我們還可以看到其他幾個相關的函數,分別爲:

  • nfds : 當前所有集合中最大的描述符值
  • void FD_CLR(int fd, fd_set *set); //從集合中刪除指定描述符
  • int FD_ISSET(int fd, fd_set *set); //判斷集合中是否有指定的描述符或就緒
  • void FD_SET(int fd, fd_set *set); //相集合中添加指定描述符
  • void FD_ZERO(fd_set *set); //清空集合

在網絡編程中使用select的優缺點可簡單總結爲:

優點: 可移植性強,可同時處理多個連接請求;
缺點: 1.監聽描述符個數有上限–1024,可以修改頭文件,但需要重新編譯;
2.需要定義數組保存所有描述符值,以便在新連接到來或者有舊連接關閉時可以重新確定最大的描述符值;
3.每次處理完畢後,需要清空並重新向集合中添加新描述符,因爲select 對描述符狀態的改變是直接在原有基礎上改變的,因此需有每次清空;
4.select 並不會告訴我們哪一個描述已經就緒,只是在原有集合上修改狀態,因此當我們處理的時候,需要循環遍歷集合中的所有描述符才能判斷哪一個是就緒描述符—(當監聽數目過大時,效率較低)。

Select使用步驟:
1.創建socket
2.定義監聽地址信息,併爲socket 綁定監聽地址
3.開始監聽(告訴系統開始監聽地址是否有數據到來)
4.將socket 描述添加到select 的監聽集合中。監聽集合用於select監聽判斷集合中的描述符是否就緒
5.select開始監聽
6.select返回值

  • < 0 select出錯
  • ==0 等待超時
  • 大於0 已經有描述符就緒

7.當描述符就緒,判斷描述符是否=監聽Socket 描述符(代表有新連接請求)
8.=socket 監聽符(accept 處理新的連接請求)
!=監聽Socket描述符(代表有傳輸數據到來),接受收據
9.接受出錯,將描述符從select監聽集合中刪除,並關閉,重新確定最大的描述符值
10.關閉Socket網絡套接字。

發佈了71 篇原創文章 · 獲贊 279 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章