0

ネットワークゲームのように(PC 1で)実行され、WiFi(アドホックなので非常に信頼性が高い)を介して別のコンピューター(2)からかなり定期的な間隔(40msなど)でデータパケットを受信するGUIを備えたC++アプリケーションがあります。 、プログラム(2)のループごとに1回。send/readを使用します。

問題は次のとおりです
。-パケットが常に完全に送信されるとは限りません(ただし、すべてが送信されるまで残りのデータを保持できるようです。これsend()でうまくいきます)
-さらに重要なことに、パケットは(1)のループ中にソケットにスタックされます。発生するまで、read()その後、データの大きなストリーム内のパケットを区別する方法、またはすでにパケットの途中にいたかどうかを知る方法はありません。

私はこれをIDヘッダーで修正しようとしました(最初のバイトとしてIDを見つけ、パケットの長さを知っています)が、私はしばしば迷子になり(不明なID:パケットの先頭にありません)、無視することを余儀なくされます残りのすべてのデータ。

だから私の質問は:
なぜパケットはスタックするのですか?(通常、私は400Bのデータを持っていますが、私のパケットは100B未満の長さであり、fps(1)と(2)はそれほど違いはありません)
実際のパケットを受信するためのより信頼性の高い方法、たとえば、パケットの80%(パケットを破棄する)を作成するにはどうすればよいですか?損失、それはUDP / TCPの問題ではありません)?

パケットを受信するための別のスレッドは機能しますか?((1)、サーバー上)

リアルタイムネットワークゲームはどのようにそれを実現しますか(複数のクライアント管理を含む)?

前もって感謝します。

(申し訳ありませんが、ここにコードはありませんが、できるだけ明確にしようとしました)

4

3 に答える 3

4

良い:

1) UDP は MESSAGES を転送しますが、信頼できません。

2) TCP は BYTE STREAMS を転送し、信頼性があります。

UDP はメッセージを確実に転送できません。より信頼性の高いものには、UDP の上にプロトコルが必要です。

TCP は、長さが 1 バイトでない限りメッセージを転送できません。より複雑なものには、TCP の上にプロトコルが必要です。

于 2012-08-23T14:08:34.700 に答える
0

あなたが説明することは、送信されたデータを構造化するためにその上にプロトコルなしでTCPを使用している場合に何が起こるかです。IDヘッダーとパケット長を使用するというあなたの考えは、そのようなプロトコルの1つです。4バイトID、4バイト長、Xバイト数を送信すると、受信者は、完全なパケットを受信するために、4バイト、4バイト、Xバイトの順に読み取る必要があることを認識します。それよりも単純になることはありません。このような単純なプロトコルでパケットの読み取りにまだ問題があるという事実は、基礎となるソケット読み取りコードに最初から欠陥があることを示唆しています。実際のコードを見ずに、何が間違っているのかを知ることは困難です。

于 2012-08-23T20:18:58.840 に答える
0
  • パケットがスタックするのはなぜですか? (通常、400B のデータがありますが、パケットの長さは 100B 未満であり、fps (1) と (2) はそれほど違いはありません)

ネット上でパケットを送信する時間はさまざまであるため、通常、高速でパケットを送信することは意味がありません。そのため、ほとんどのネットワーク ライブラリ (RakNet など) はパケットをキューに入れ、10 ミリ秒ごとに送信を行います。

TCP の場合、同じことを行うより原則的な方法である Nagle のアルゴリズムがあります。NO_DELAY TCP フラグを設定することで、Nagle をオフにすることができます。

  • 実際のパケット、たとえばパケットの 80% を受信するためのより信頼性の高い方法を得るにはどうすればよいですか (パケット損失を破棄します。これは UDP/TCP の問題ではありません)。

TCP を使用すると、すべてのパケットが正しい順序で受信されます。TCP を使用する場合のペナルティは、パケットがドロップされた場合です。その後のパケットは、そのパケットが再送信されるまで待機してから処理されます。これにより顕著な遅延が発生するため、TCP を使用するすべてのゲームには、この遅延を隠すための洗練された予測技術と、欠落したパケットが到着したときにスムーズに「追いつく」ための他の技術があります。

UDP を使用する場合、信頼性を提供するレイヤーを最上位に実装できますが、各パケットでカウンターを送信し、受信者がカウントのギャップを送信者に繰り返し通知することにより、パケットの順序が問題にならない場合は順序付けは必要ありません。 . 同様のことを行うことで、順序付けを実装することもできます。もちろん、両方を強制すると、独自の TCP 層が作成されます。詳細については、 http://www.jenkinssoftware.com/raknet/manual/reliabilitytypes.htmlを参照してください。

于 2012-08-23T16:04:53.790 に答える