2016-11-01 16 views
0

我有用C++編寫的基本上是「聊天程序」的這個雙面(客戶端和服務器)程序。沒有多線程的C++套接字不同步/並行代碼

所以一方向另一方發送數據給另一方。 我正在使用C-Sockets(TCP/SOCK_STREAM)。

所以我的問題是,雖然服務器正在等待數據(「recv()」)它不能發送數據本身,因爲接收隊列是無限的,據我的經驗顯示。

我已經想到了兩種方法來解決這個問題,但我不知道它的價值的時間。因爲可能有一個簡單的解決方案,我太笨了。

  1. 使它成爲一個6面連接,這意味着我有一個「物理服務器」,我的服務器在四個實例中運行,每個客戶端(發送和接收)兩次。所以如果一臺服務器接收到數據,它將數據存儲在一個文件中,另一臺客戶端的發送服務器讀出併發送它。相反的工作方式。

由於這種解決方案聽起來相當低劣,我可能不會去用它。

  • 使用多線程。這是我聽說過的純癌症使用,你不應該使用它,除非你必須使用。
  • 所以我的問題是,我有什麼打算?或者有可能是一個簡單的解決方案?

    回答

    0

    的阻隔插座recv()當你需要等待輸入數據和什麼都沒有做,直到數據到達時使用。如果不是您的情況,您可以使用non-blocking socketselect超時。 select會更簡單,只需檢查是否有任何東西定期(例如,在一個循環中)在你的套接字上到達,然後做你想要的。

    順便說一句,這就是所謂的「BSD套接字」,而不是「C座」,這可以幫助你使用Google。

    +1

    考慮在支持它的平臺上使用'epoll()'而不是'select()'。 –

    +0

    @RemyLebeau:你說得對。實際上,我不直接使用它們中的任何一種,而更喜歡Boost.Asio等跨平臺高級解決方案 –