2012-03-29 19 views
4

TCPはストリームベースです。つまり、必ず「メッセージ」に入れないでバイトを送信するため、受信者はメッセージの半分または1/2を得ることができます。TCPストリームでのメッセージの送信

メッセージが固定サイズのゲームのようなものでは、メッセージの一部を受け取った場合、他の部分を受信するまでバッファに保持できます。これはちょっと退屈ですが、メッセージベースの信頼できるプロトコルがありますか?おそらくありますが、TCPやUDPのようにOSに実装されているものはありませんので、使用しやすいライブラリが必要です。

私はいつもやや信頼性の高いUDPプロトコルを作ることができました。どちらをお勧めしますか?

答えて

2

UDP経由で独自のACKベースのプロトコルを実装できます。メッセージに送信側のメッセージ/シーケンス番号を付加し、その番号を受信側の送信側に返します。各メッセージの送信側でタイマーを開始し、対応するACKを返すとキャンセルします。タイマーがポップしたら、メッセージを再送信してください。

XMPPはこのアプリケーションではあまりにも重すぎます。

+0

この質問が再びポップアップしたとき、私はこれが実際にやったことを思い出しました。 – slartibartfast

+0

UDPの周りの "信頼できない"という概念は、それを使って人を惑わせる可能性がありますが、ほとんどの場合、TCPにあるような追加の信頼性対策がプロトコルに組み込まれていません。いくつかの文脈では、それらを必要としたり、それらを再現することさえできません。アプリケーションがフォールトトレラントである場合、またはネットワークの設計とデータの負荷がフォールトを許容レベルまで低減した場合リアルタイムの文脈では、これらの追加機能は損害を与える可能性があります。ゲームのコンテキストでは、この方法で使用されるUDPは非常に一般的です。 – omatai

0

XMPPをご覧ください。これはXMLメッセージに基づくTCP/IPベースのプロトコルです。

+0

おそらく、これはゲームでは少し遅く重いでしょうか? – slartibartfast

0

プロトコルバッファは、XMPPではあまり知られていませんが、あなたのケースでは興味深いかもしれません。

http://code.google.com/intl/en-US/apis/protocolbuffers/docs/overview.html

+0

プロトコルバッファは面白く見えます。私はそれを見てみましょう。 – slartibartfast

+0

正式なCバージョンはなく、サードパーティのものはまだ完全には機能していません。質問はC++ではなくCでタグ付けされているので、これを言及してください。 – Ioan

+0

この回答は質問とは関係ありません。プロトコルバッファはネットワーキングの問題を解決せず、シリアル化のみを提供します。 – kshahar

1

あなたはトランスポート層プロトコルを探している場合は、SCTPを確認してください。 SCTPはUDPのようなメッセージ指向であり、TCPのような輻輳制御を備えたメッセージの信頼性の高い順送りを保証します。

SCTPはまだ広く使用されていません。だから、私は何らかの種類のメッセージフレーミングでTCPを使うことを提案します。

+0

良いライブラリがありますか? – slartibartfast

+0

Linuxカーネルはこれをサポートしています。また、BSDカーネルの実装も存在します。私はWindowsまたはユーザー空間ライブラリについて知らない。 – SKi

+0

http://www.bluestop.org/SctpDrv/は、Windows上のSCTPの可能なドライバです。 – Ioan

1

メッセージングインフラストラクチャとしてØMQ(ZeroMQ)を使用できます。 ZeroMQは、TCPやその他のトランスポートメカニズムの上で信頼性の高いメッセージパッシングを提供します。それはC APIと包括的なguideを持っています。

すべてのピアに外部ライブラリを使用する必要がありますが、それは問題ありません。

関連する問題