我正在編寫C++的多客戶端聊天程序,我遇到了一些我無法解決的問題。
1.當用戶進入時,服務器將Accept()
客戶端,然後分配一個套接字id給客戶端。當客戶端斷開時,另一個客戶端進入服務器Accept()
之後,客戶端將獲得另一個套接字ID。我想重新使用套接字ID,但Accept()
將提供比先前客戶端的先前套接字ID更大的套接字ID。那麼,我如何將套接字ID分配給每個客戶端呢?
如何分配套接字ID並且不共享C++中的環境變量
2.我用select(fdmax + 1, &read_fds, NULL, NULL, NULL)
和for(i = 0; i <= fdmax; i++)
來掃描每個存在的連接,客戶端可以用tenlet連接到我的服務器。除了聊天,客戶端可以在我的服務器上運行命令(如ls
,cat
),我的服務器將使用fork()
和dup()
將結果發送到客戶端。這是一個問題,如果用戶分配了一個新的環境變量PATH
,其他客戶端的PATH
也將被更改。我怎樣才能避免這種情況,每個客戶都應該有自己的默認值PATH
值?
由'accept'(它不是一個id,但實際的套接字句柄)返回的「套接字ID」是沒有什麼可以改變的。如果你想要發明自己的方案,可以使用'std :: unordered_map'作爲轉換表。 –
至於第二個問題,當允許未知的客戶端在你的系統上運行命令時,你應該非常小心謹慎!想想如果命令恰好是「rm」會發生什麼。 –
@JoachimPileborg當客戶端連接到我的服務器時,系統會將其PATH變成另一個目錄,但客戶端也可以更改PATH。我的服務器會過濾'/'字符以防止安全問題。我會非常小心的處理它,非常感謝你注意到我! – Andy