-2

Windowsでqtを使用してtcpサーバーを開発しました。約 10 ~ 20 のクライアントがサーバーに接続し、サーバーとクライアントの間でデータ転送が行われています。接続されたクライアントごとに異なるスレッドがあります。サーバーはパケットを送信し、ACK が受信された場合はこのデータ パケットに対する応答を待ち、次のパケットを送信します。応答がない場合はタイムアウトになります。クライアントが 2 分以内に応答を送信しない場合、サーバーは同じパケットを再度送信します。

それで問題ありません。(ちなみに、私のコンピューターのwindows7 home premium)アプリケーションをwindows7 Ultimateを搭載した他のコンピューターに持ち込むと、タイムアウトが発生すると、同じデータパケットを再度送信する代わりに、何もしません。私のコンピューターとこのコンピューターのもう 1 つの違いは、このコンピューターには qt がインストールされていないことです。必要な dll を使用してアプリケーションを実行します。

この問題の原因は何ですか?

前もって感謝します。

4

1 に答える 1

1

まず、命名法を整理しておく必要があります。

  • IP はパケットを送信します
  • TCP 送信セグメント
  • ソケットはdata-streamを送信します。( std::streamとは異なる概念)

IP はデバイス ドライバーとして実装され、TCP はその上で動作するドライバーとして実装され、soket はアプリケーション (静的または動的) にリンクされたライブラリであり、すべての QT はソケットを使用してデータを送信するライブラリです。

ストリーム フローをセグメントに分割する役割はソケット ライブラリに属し、セグメントをパケットに分割し、それらを列挙し、何かが欠落しているかどうかを確認し、再送信を要求する役割は TCP に属します。

コードはそれらすべてを処理する必要はありません。データを送受信し、永続的で回復不能な TCP 障害が発生した場合に基礎となるソケットが報告する可能性のあるエラー状態を管理する必要があるだけです。

ネットワークのタイムアウトを定義するのはコードの役割ではありません (それについて 30 年以上前に確立され、定義された標準があります。他のことを自分で行うと、ネットワーク マネージャーの生活が台無しになり、アプリケーションに何の価値も追加されません)。

あなたの問題は、タイミングと「伝送制御」との間の競合である可能性が最も高く、基礎となるTCPネゴシエートされたタイミング(これは、両側のドライバーのavaialeバッファサイズにも依存し、OSだけでなくO が実際に時間をかけて行っていること) が原因で、2 つの制御システムが不安定な方法で改造されます。

于 2013-01-30T08:11:32.553 に答える