2012-04-05 102 views
2

我目前有一個基於C++的基本聊天程序,它使用WinSock2.h和UDP。目前,用戶能夠向服務器發送消息,並且服務器只是發回相同的消息。我想知道我從哪裏去(我不是要求代碼)。我想知道如何讓郵件發送到另一個也連接到服務器的客戶端。在C++中創建一個基本的UDP聊天程序

如果我需要解釋我已經做了什麼,請讓我知道。

所有的建議,非常感謝。

感謝

+3

你爲什麼使用UDP?你知道,如果數據包丟失,你可能會失去部分聊天權限,因爲沒有交付保證,與TCP不同, – devshorts 2012-04-05 19:49:23

+0

@devshorts我只是在做一個基本的聊天..如果數據包丟失了,它真的不是一個大問題。我只是爲了簡單,現在 – user1219627 2012-04-05 21:11:49

回答

3

你將不得不當前連接的用戶的列表,當用戶發送消息時,它會然後將其張貼到所有連接的用戶。

您的服務器會跟蹤誰連接,並刪除那些斷開連接。當有人連接或斷開連接時,它會向所有當前連接的用戶發送通知,告訴他們此通知。

所有這些都不是特定於UDP,事實上,對於這種類型的消息,TCP可能會更好,因爲您不必擔心消息被丟棄。只有在性能最重要的情況下才應使用UDP,例如實時遊戲和語音聊天。

+0

所以我想客戶端打電話給服務器,將返回一個客戶端的ID。我將如何前進這個電話?我正在考慮發送一個初始消息,就像有人發送文本一樣,但我認爲必須有更好的方式 – user1219627 2012-04-05 21:24:46

2

當你說「連接」(在客戶端的背景下) - 你究竟是什麼意思?因爲你說你在你的程序中使用UDP。

在UDP協議中沒有「連接」狀態,除非你實現它。
然而,在TCP協議中,有(在協議本身內實現的)。

此外,「廣播」的基本思路很簡單 - 保留連接的客戶端列表
連接時添加客戶端。斷開時將其從列表中刪除。
然後當你想發送消息給每個人時,你只需遍歷這個列表。

同樣,在跟蹤「已連接」的客戶端之前,您必須先接收這些dis/connect事件。

如果你使用TCP而不是UDP,那麼你就設置好了。

祝你好運。

+0

堅持使用UDP,我怎樣才能使這些調用服務器將其添加到列表中。現在我只知道發送和接收郵件 – user1219627 2012-04-05 21:27:27

+0

看,如果你堅持使用UDP,那麼你必須確保服務器保持「連接」客戶端的某個「註冊表」。一種方法是讓客戶端應用程序每60秒向服務器發送一條代碼爲「我在這裏」的消息,以便服務器知道客戶端在線。當服務器需要廣播消息時,它會重複客戶端列表,但在實際發送消息之前,它會比較時間並確保每個客戶端在最近60秒內發送「我在這裏」消息。超時排序。 – Poni 2012-04-06 15:25:09

0

基本上,像馬修說的,你需要存儲所有當前連接到服務器。當套接字連接時,您可以存儲對該套接字的引用。現在,無論何時客戶端發送消息,您都可以將其重新廣播到所有套接字。現在,當套接字斷開時,您必須處理,因爲您不想存儲一堆封閉的套接字。