2015-09-28 28 views
1

我想編寫一個簡單的客戶端 - 服務器應用程序,其中客戶端可以發送或廣播發送給一個或網絡中的所有客戶端。服務器存儲連接到它的所有IP地址,並在新客戶端連接時廣播新IP。C++與單個消息客戶端/服務器應用程序和廣播

我不太清楚如何實現一個單一的消息發送到另一個客戶端。我只需要向服務器發送TCP消息,並將所需的接收者作爲數據放入TCP層,然後由服務器提取它,以便知道將它發送到哪裏?

我也想加密添加到其中,然後將不再允許服務器讀取數據的消息,所以我不知道如何解決!?

我使用C++和QT5爲實現

回答

1

我不太清楚如何實現一個單一的消息發送到 另一個客戶端。我只需要發送一個TCP報文到服務器 ,並把所需的收件人的數據,然後將其 因此它知道在哪裏發送服務器中提取的TCP層?

在一個理想的世界裏,客戶可以跟對方直接,因爲他們可以從服務器找出其他客戶端的IP地址(通過其廣播或通過請求IP列表從地址服務器)。如果你的所有客戶都在同一個局域網上運行,那可以很好地工作。

假設你希望你的系統通用互聯網上運行,但是,這是行不通的這麼好,因爲許多/大多數客戶將是不同的防火牆後面,所以他們不會接受傳入的TCP連接。 (這裏有一些ways,但他們需要對TCP的工作原理有一個非常高級的理解,即使它們只在某些情況下工作,所以我不建議在第一個項目中嘗試它們)。一個可靠的客戶端 - >客戶端消息傳遞機制,最好的辦法就是讓發送客戶端將消息發送到服務器,以及一些告訴服務器哪些客戶端應該轉發消息的短頭。我的own客戶端/服務器消息傳遞系統可以按照這些方式工作,並且我發現它運行良好。

我也想加密添加到那麼這將不會 不再允許服務器讀取數據的消息,所以我不知道如何解決 是!?

不必擔心添加加密功能,除非您首先使用基本的非加密功能,因爲加密會使調試變得更加困難。這就是說,它是完全可能的加密/不透明數據傳遞給服務器,只要上述的報頭數據(其告訴服務器,其中轉發所述消息給)是不加密的(因爲服務器將需要能夠讀取頭部知道如何處理加密數據)。更棘手的部分是接收客戶端從服務器獲取轉發數據時 - 接收客戶如何知道如何解密?你需要一些外部機制讓客戶共享密鑰(對稱密鑰或公鑰/私鑰對),因爲如果你通過服務器自己發送加密密鑰,那麼加密任何東西都沒有多大意義(因爲服務器可以保留它轉發的任何密鑰的副本,並使用它們來解密,如果它想的話)

+0

感謝您的回答,我一直在考慮使用PGP,當客戶端連接到網絡時,它會詢問公鑰和將其自己發送到網絡中的現有客戶端。因此,服務器不必存儲任何數據,只能存儲客戶端。有關於此的任何想法? – wasp256

+0

請記住,如果你不打算信任服務器,那麼你必須考慮到一個邪惡的服務器可能會做一些事情,比如將一個假公鑰轉發給目標客戶端而不是真正的公鑰等等。試圖防止中間人攻擊很困難,除非至少有一部分通信不通過不受信任的服務器。 –

相關問題