本文概述如何使 服務器同時 連接處理 客戶端們。
即服務器的一個進程只負責接受 請求連接的客戶端。而具體如何跟各個客戶端發送數據交給自己創造的子進程去完成。
用TCP協議來舉例。
服務器在創造套接字,並用套接字創建監聽隊列後,陷入循環,循環裏負責的是隻要accept接受到了客戶端的鏈接,就會fork出一個子進程,子進程裏和客戶端去具體的send recv。而父進程則進入下一次循環裏繼續accept等待新的客戶端連接加入。
由於父進程共享文件描述符,所以不必要傳遞文件描述符。
父進程創建出子進程後,由於父子進程的pcb是淺拷貝,父子進程的pcb結構體 某一項成員指針struct file* 共同指向同一個struct file結構體,這個file結構體裏某個成員結構指針指向的struct m_iode纔是打開文件的各種信息,所以file結構體裏會有個 count成員 統計所有指向 file結構體的指針,只有所有指向file的指針都失效纔會徹底關閉這個文件,釋放佔用的 文件描述符,因此不僅要子進程close(c),父進程也要在進入下一次循環前close(c),這裏的c指的是accept返回的文件描述符。
客戶端代碼:
結果如下:
2個客戶端程序cli都同時連入
我們再看看是否能同時保持連接,同時發送單詞。