從打地鼠遊戲來看Winsock的Select模型

2021-10-23 11:47:51 字數 1379 閱讀 7839

對於學習過c/s網路程式設計的讀者來說,對select模型一定不會陌生。select模型是winsock中的5種i/o模型之一,它主要用來實現tcp的一對多通訊(即乙個伺服器端程式同時和多個客戶端程式進行通訊)。實現tcp一對多通訊的方法很多,最原始的辦法是採用多執行緒技術,在伺服器端同時開啟很多個執行緒,每個執行緒分別與乙個客戶端進行通訊。這種方法的缺陷是連線的客戶端不能太多,如果客戶端過多,就會導致伺服器端執行緒數量過多,使伺服器端的記憶體資源耗盡。

那麼是否可以讓伺服器端在乙個執行緒中同時和很多個客戶端進行通訊呢?答案是可以的,其中的一種方法就是使用select模型。

為了實現一對多通訊,select模型在伺服器端管理著乙個套接字集合fd_set,這個集合中有很多個套接字,分為通訊套接字和監聽套接字。每個通訊套接字都可以與乙個客戶端單獨進行通訊。當套接字集合中的某個通訊套接字收到乙個事件時,select函式會返回乙個值,此時就可以用程式對該事件進行處理,例如,如果是接收到資料的事件,就用recv()函式去接收資料。如果是請求連線的事件,則使用accept()函式去接受連線。因此程式需要時刻監視select模型是否有值返回,這說明select模型是阻塞的,就像打地鼠遊戲一樣,遊戲者需要時刻監視是否有地鼠冒出頭來。

打地鼠遊戲機的臺面上有很多只地鼠,因此可看成是乙個地鼠的集合。如果把地鼠看成套接字,那麼地鼠伸出頭來就對應套接字有可讀事件。而打地鼠則對應去處理可讀事件。

相似點

區別:

另外需要注意的是:在普通的tcp通訊程式中(未使用winsock i/o模型),伺服器端的accept函式是先於客戶端的connect函式執行,即伺服器執行accept函式陷入阻塞,等待客戶端執行connect函式傳送連線請求。

而在select模型中,客戶端的connect函式先於伺服器端的accept函式執行,因為客戶端先傳送連線請求,伺服器端select函式獲取到請求連線的事件,再讓監聽套接字呼叫accept函式接受連線。

摘自《tcp/ip網路程式設計專案式教程》

打地鼠遊戲

題目描述 輸入輸入包含3行,第一行包含乙個整數n 1 n 100000 表示有n個地鼠從地上冒出來,第二行n個用空格分隔的整數表示每個地鼠冒出後停留的時間 maxt 50000 第三行n個用空格分隔的整數表示每個地鼠被敲擊後會增加的分值v v 1000 每行中第i個數都表示第i個地鼠的資訊。輸出輸出...

打地鼠遊戲

時間限制 1 sec 記憶體限制 128 mb 題目描述 輸入輸入包含3行,第一行包含乙個整數n 1 n 100000 表示有n個地鼠從地上冒出來,第二行n個用空格分隔的整數表示每個地鼠冒出後停留的時間 maxt 50000 第三行n個用空格分隔的整數表示每個地鼠被敲擊後會增加的分值v v 1000...

地鼠遊戲 貪心

題目描寫敘述 description 王鋼是一名學習成績優異的學生,在平時的學習中,他總能利用一切時間認真高效地學習,他不但學習刻苦,並且善於常常總結 完好自己的學習方法,所以他總能在每次考試中得到優異的分數,這一切非常大程度上是因為他是乙個追求效率的人。但王鋼也是乙個喜歡玩的人,平時在學校學習他努...