2012-11-10 16 views
0

我正在編寫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值?

+0

由'accept'(它不是一個id,但實際的套接字句柄)返回的「套接字ID」是沒有什麼可以改變的。如果你想要發明自己的方案,可以使用'std :: unordered_map'作爲轉換表。 –

+0

至於第二個問題,當允許未知的客戶端在你的系統上運行命令時,你應該非常小心謹慎!想想如果命令恰好是「rm」會發生什麼。 –

+0

@JoachimPileborg當客戶端連接到我的服務器時,系統會將其PATH變成另一個目錄,但客戶端也可以更改PATH。我的服務器會過濾'/'字符以防止安全問題。我會非常小心的處理它,非常感謝你注意到我! – Andy

回答

0

對於第一個問題:您可能未關閉(close(2))套接字(即使客戶端斷開連接)。儘管我在POSIX規範中找不到它,但通常accept(2)(以及幾乎任何創建文件描述符的東西)都會返回儘可能最小的描述符。

這就是說,有可能沒有理由將您的應用程序與此綁定。您的應用程序應該將accept視爲可以返回任何內容。

對於第二個問題,在分叉之後,您應該更改PATH,就在exec之前。


這一切不談,我注意到你標記你的問題C++:你應該看看威猛asio

+0

謝謝,我將檢查我的代碼並更正它,並嘗試在'exec'前的'fork'後面使用'setenv()'來解決我的問題。 – Andy