我一直在C中處理一個複雜的服務器 - 客戶機系統,我不確定如何實現套接字通信。任意雙向UNIX套接字通信
簡而言之,系統是一個服務器應用程序,它與數據庫通信並使用UNIX套接字與一個或多個使用fork()
創建的子進程進行通信。孩子的目的是運行遊戲服務器。啓動遊戲服務器的過程如下所示:
- 服務器/「管理器」標識要創建的數據庫中的遊戲服務器。 (假定數據庫通信已經排序。)
- 經理分出一個孩子(「遊戲控制器」)。
- 遊戲控制器設置了兩個管道對,然後分叉,用管道替換其子標準輸入,並使用另一個管道輸出標準輸出和標準錯誤。
- 遊戲控制器的小孩然後運行
execlp()
開始運行實際的遊戲服務器可執行文件。
我對套接字的使用經驗很少。在GNU C文檔here中的簡單示例中,我已經在將多個客戶端「複用」之前在服務器應用程序上使用了select()
。
我現在有一個新的挑戰,因爲系統必須能夠做更多的事情:管理者需要能夠隨意地發送命令給遊戲控制器的孩子(它會通過定期檢查數據庫來發現)並獲得回覆,但也期望從它們傳入的任意命令/錯誤併發送回應。
所以,我需要一種「上下文」系統,其中套接字僅在它們之間有意義。換句話說,當一個命令從管理器發送到遊戲控制器時,每一方都需要知道誰在問,並知道答覆是什麼(因此,它是哪個命令的答覆)。
由於select()
僅用於瞭解何時有傳入數據,並且線程應該阻塞它,我是否需要另一個線程來發送數據並獲取答覆?這是否需要每個遊戲控制器(儘管在技術上都是「客戶端」)使用偵聽套接字並使用select()
?
我希望我已經簡明地解釋了系統和問題;如果需要,我會添加更多細節。謝謝!
我想我大部分都能理解,但是你能解釋一下你的意思嗎?「套接字只在他們自己之間有意義」? – frankc 2011-12-22 21:54:22
通過套接字發送的命令將從其對應方回覆,比如如何接受(),並且您收到另一個向另一方向流動的套接字?或者,也許有一種更有效的方式來實現基本的推斷過程。 – Doddy 2011-12-22 22:13:58
「每個參與方都不知道誰在問」,因爲他們知道他們從哪個套接字接收數據? – 2011-12-23 03:19:46