2012-04-05 9 views
2

私は現在、UDPでWinSock2.hを使用する基本的なチャットプログラムをC++で持っています。現在、ユーザーはサーバーにメッセージを送信でき、サーバーは同じメッセージを戻します。私はここからどこに行くのだろうと思っていた(私はコードを求めていない)。私は、メッセージがサーバーにも接続されている別のクライアントに送信されるように進めるべきだと思っていました。C++での基本的なUDPチャットプログラムの作成

私がすでに行ったことを説明する必要がある場合は、私に知らせてください。

すべての提案をいただければ幸いです。

おかげ

+3

なぜUDPを使用していますか? TCPと違って配送保証がないので、パケットが失われた場合にチャットの一部を失う可能性があることをご存知でしょうか? – devshorts

+0

@devshorts私は基本的なチャットの作成に取り掛かります。パケットが失われた場合、それは本当に大きな問題ではありません。私はちょうど今簡単に行く – user1219627

答えて

3

あなたは、ユーザーがメッセージを送信するとき、それはすべての接続のユーザーにそれを投稿します、現在接続しているユーザーのリストを持っているでしょう。

あなたのサーバは、誰が接続しているかを追跡し、切断されたユーザを削除します。誰かが接続または切断すると、現在接続されているすべてのユーザーにこの通知を通知します。

これはすべてUDPに特有のものではありませんが、メッセージが落とされる心配がないので、このタイプのメッセージングにはTCPがおそらく適しています。 UDPは、リアルタイムゲーム、ボイスチャットなど、パフォーマンスが最も重要な場合にのみ使用してください。

+0

私はクライアントのIDをクライアントに返すだろうサーバーへの呼び出しを考えていたので。この電話をするにはどうすればいいですか?私はちょうど誰かがテキストを送信するのと同じ方法でインライフメッセージを送信することを考えていましたが、より良い方法が必要であると仮定しました – user1219627

2

"接続"(クライアントのコンテキストで)と言っているとき - 正確に何を意味していますか?あなたはあなたのプログラムでUDPを使っていると言いますから。

UDPプロトコルでは、実装しない限り、「接続済み」状態はありません。
ただし、TCPプロトコルには(プロトコル自体の中で実装されている)ものがあります。

さらに、「を放送」の基本的な考え方のメッセージは単純です - 接続しているクライアントのリストを保持します。
接続時にクライアントを追加します。切断時にリストから削除します。
その後、全員にメッセージを送信する場合は、このリストを反復するだけです。

「接続された」クライアントを追跡するには、前回のディスア/接続イベントを受信する必要があります。

UDPの代わりにTCPを使用すると設定されます。

幸運。

+0

UDPに固定してサーバーにこれらの呼び出しを行ってリストに追加する方法今すぐメッセージを送信し、受信することを認識しています – user1219627

+0

あなたがUDPを主張するならば、サーバーは "接続された"クライアントの特定の "レジストリ"を保持していることを確認する必要があります。これを行う1つの方法は、クライアントアプリケーションが60秒ごとに「ここにいる」というコードのメッセージをサーバーに送信させることです。サーバーはクライアントがオンラインであることを認識します。サーバーがメッセージをブロードキャストする必要がある場合は、クライアントリストを繰り返し実行しますが、実際にメッセージを送信する前に、時間を比較して、最後の60秒以内に各クライアントが「ここにいる」というメッセージを送信していることを確認します。時間切れの並べ替え。 – Poni

0

Matthew氏のように、現在のすべての接続をサーバーに保存する必要があります。ソケットが接続されると、そのソケットへの参照を格納できます。クライアントがメッセージを送信するたびに、そのメッセージをすべてのソケットに再ブロードキャストできます。閉じたソケットをたくさん格納する必要がないので、ソケットの切断時にも処理する必要があります。

関連する問題