linux socket的select函式例子

2021-05-25 16:19:03 字數 1370 閱讀 8186

使用select函式可以以非阻塞的方式和多個socket通訊。程式只是演示select函式的使用,功能非常簡單,即使某個連線關閉以後也不會修改當前連線數,連線數達到最大值後會終止程式。

1. 程式使用了乙個陣列fd_a,通訊開始後把需要通訊的多個socket描述符都放入此陣列。

2. 首先生成乙個叫sock_fd的socket描述符,用於監聽埠。

3. 將sock_fd和陣列fd_a中不為0的描述符放入select將檢查的集合fdsr。

4. 處理fdsr中可以接收資料的連線。如果是sock_fd,表明有新連線加入,將新加入連線的socket描述符放置到fd_a。

樓主真是太厲害了,select用的真是巧妙!完全實現在單執行緒的情況下多使用者通訊,我執行過**,非常成功!不過經過我覺得樓主在accept函式裡面fd_a[conn_amount++] = new_fd;可以稍加改進,按照樓主的意圖,會出現當乙個使用者不斷連線再斷開的情況下,當連線次數超過maxconnection的時候,就會退出,因此fd_a[i]沒有很好的利用,不能實現動態管理,我建議僅將conn_amount僅作為客戶端連線數,而不是有連線就增加,當accept成功的時候,就加1,當recv=0的時候就減1;建議將fd_a[conn_amount++] = new_fd;這句程式改為

for(i = 0;i < maxclient;i++)

}conn_amount++;

這樣就可以重複利用fd[i]的空間;

另外在recv返回值<=0的時候,加一句conn_amount++;

還有一點,超過最大連線數的時候break應該為continue,這樣會更人性化一點,客戶端太多關閉它的請求就行了,沒必要自毀,這樣整個系統就可以動態與客戶端實現連線,很感謝樓主的貢獻,使我少走了很多彎路,現在在樓主的基礎上,我基本上已經實現了多使用者訪問的伺服器端程式,而且還加上了資料庫,我覺得這個世界是這麼的美妙!

乙個多月沒碰了,不過當時聽說select有這麼大的作用,很興奮,當時要實現單執行緒多使用者,剛好select提供了這一切,由於整個專案有很多內容,還包括資料庫和qt介面部分,因此,裡面會有像qdebug、emit 這樣的函式或者關鍵字,不過這不影響閱讀,朋友們可以根據需要用printf等函式代替或者去掉,這裡只提供socket連線部分,下面的函式中可能有部分是巨集定義,比如buf_size,maxclient等。該函式除了實現動態管理最大連線數外,還限制了乙個連線的空閒連線時間(max_idleconnctime),各位如看到下面讀取系統時間這部分即為連線控制,目的就是為了,當乙個使用者在一定時間內沒有連線請求,也沒有傳送和接受資料,伺服器就可以關掉這個連線,這樣同時還有效的制止了一些非常規的斷開方法,比如客戶端突然斷電,拔掉網線等(這個時候,服務端是檢測不到的客戶端已斷開)。

這些**,經過長時間測試,沒有出現問題,朋友們如果有什麼更簡潔高效的方法,一定要共享出來哦!

SEL的簡單解釋

sel就是對方法的一種包裝。包裝的sel型別資料它對應相應的方法位址,找到方法位址就可以呼叫方法 1.方法的儲存位置 2.sel物件的建立 sel s1 selector test1 將test1方法包裝成sel物件 sel s2 nsselectorfromstring test1 將乙個字串方法...

linux socket 程式設計

兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...

linux socket程式設計

雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...