《TCP/IP網絡編程》第12章 筆記&代碼&註釋

本人常用環境是WINDOWS,因此暫時略讀根據書上提示跳過10、11章進行筆記:

Windows相較於Linux,多進程服務器並不適用,10~11章重點放在Linux平臺。

複用

在一個通信頻道中傳遞多個數據(信號)的技術。

爲了提高物理設備的效率,利用最少的物理要素傳遞最多的數據使用的技術。

I/O複用服務器端

類比成課堂:1位老師服務多位學生;只有當(客戶端)學生舉手提問,老師纔會在收到舉手的信息(收到數據的套接字)後回答問題。也就是現在的教室以I/O複用方式運行。

select()函數

//Window
int select(int maxfd,fd_set* cprReads,fd_set* writeset,fd_set* readset,fd_set* timeout)
/*
在windows中,maxfd 並無意義,只是爲了其他平臺系統的兼容性,因此傳0
readset 關注“是否存在待讀取數據”
writeset 關注“是否可傳輸無阻塞數據”
timeout 關注“超時信息(time-out)”

實際使用我們根據需要關注的功能進行傳參,其他情況傳0。
*/

select()函數可以將多個文件描述符集中到一起統一監視,監視項目:

  • 是否存在套接字接收數據?
  • 無需阻塞傳輸數據的套接字有哪些?
  • 哪些套接字發生了異常?

調用方法和順序

  1. 設置文件描述符→指定監視範圍→設置超時
  2. 調用select函數
  3. 查看調用結果

一共三個步驟。

利用fd_set數組變量對文件描述符進行監視,數組下標位置爲該文件描述符所在位置,該位置爲1,則表示該對象爲監視對象,0則相反。

利用宏完成對fd_set變量中註冊或更改值的操作:(Linux與Windows一致)

  • FD_ZERO(fd_set * fdset) fd_set所有位置初始化爲0
  • FD_SET(int fd, fd_set * fdset) 在fdset指向變量中註冊描述符fd的信息
  • FD_CLR(int fd, fd_set * fdset) 在fdset指向變量中清除描述符fd的信息
  • FD_ISSET(int fd, fd_set * fdset) 若fdset指向變量中包含註冊描述符fd的信息,則返回真

代碼:(含註釋 Windows)

https://github.com/ChristmasError/TCP-IP-Network-programming/tree/master/%E7%AC%AC%E5%8D%81%E4%BA%8C%E7%AB%A0%20IO%E5%A4%8D%E7%94%A8

爲了效果,你可以同時開多幾個客戶端進行測試。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章