2012-11-05 60 views
3

我有兩個應用程序,一個是客戶端,另一個是服務器。服務器啓動客戶端作爲子線程。客戶端然後通過其標準輸出命令。服務器等待相應的命令和響應。客戶端/服務器應用程序通過命令行與線程進行通信C++

基本上客戶端服務器通過標準輸出。

例如:

client >> Move north 
Server >> Your new location is {2,3} 
client >> Move north 
Server >> Your new location is {2,2} 
client >> Shoot east 
Server >> Projectile 66638 heading east {3,2} 

的問題是,我不知道如何將兩個應用程序連接在一起,這樣服務器和閱讀並響應客戶端應用程序。

我想使用命令行作爲通信層的原因是我希望保持客戶端的創建儘可能簡單。

此外,每次可能有多個客戶端,客戶端應該能夠相互獨立地與服務器進行通信。 (他們不應該能夠看到對方的通信)

目前我通過CreateProccess()函數啓動應用程序。該功能可以輕鬆設置應用程序的初始命令行參數。之後就不是溝通。

我的問題是:

  • 那如何啓動一個客戶端應用程序的線程服務器應用程序,讀/寫客戶端的標準輸出?
+3

你需要做的第一件事就是查找[如何在C++中創建管道](http://stackoverflow.com/questions/5840109/how-to-make-a-pipe-in -c) – Kiril

+0

嘗試重定向stdout是使用命名管道的一種漫長而痛苦的方式。如果您已經使用CreateProcess(),請使用此SDK文章獲取指導:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590%28v=vs.85%29.aspx –

+0

您可以'當使用線程時,確實使用'stdout' /'stdin'作爲通信方式。如果你把客戶端放在一個單獨的_process_中,它可以工作,但我不會稱之爲好的設計。相反,您應該查看其他溝通方式,例如管道或套接字。當你的客戶端不屬於你的服務器時,這將有助於你的未來。 –

回答

0

如上評論者指出,命名管道(或插座)是去這種解決方案的方式,這是你可能需要兩個獨立的過程,而不是線程。

在Windows中,TransactNamedPipe()系統調用可幫助您完成所需的任務。它非常適合將命令發送到服務器並等待響應,使創建一個客戶端可以輕鬆地執行與(同步)到服務器的遠程過程調用非常相似的客戶端。

+0

我不會創建客戶端應用程序。我希望儘可能簡單的爲將要創建客戶端的人員提供服務,這就是爲什麼我希望他們能夠使用標準。我擔心的管道對他們來說太複雜了。我的服務器可以像它需要的那樣複雜。 –

相關問題