1

Qt5 の QTcpSocket クラスの新しいバインド機能を使用して困っています。これを理解するための助けをいただければ幸いです。

それぞれ別の IP アドレスを持つ 2 つの NIC を含むマルチホーム サーバーがあります。サーバー上でルーティングをセットアップして、送信元アドレスからの送信がターゲットのリモート アドレスに関係なく適切な NIC から送信されるようにしました。つまり、データの送信先に関係なく、xxx0 からの送信は eth0 を介して送信され、xxx1 は eth1 を介して送信されます。これらの NIC は、イーサネット経由で長距離の Wifi リンクに接続され、スイッチに接続されます。これらの Wi-Fi リンクはトランスペアレント ブリッジとして機能し、むしろ 2 本のイーサネット ケーブルと見なすことができます (ただし、帯域幅は制限されています)。次に、スイッチをコンピュータに接続します。目標は、サーバーとコンピューターの間でデータを転送し、2 つの Wi-Fi リンクを並行して使用して帯域幅を増やすことです。サーバーは物理的にはサーバーですが、ソフトウェアには、ソフトウェアサーバーとして実行されているコンピューターがあります(他の人がそれに接続するため)。つまり、物理サーバー (ソフトウェア クライアント) は TCP ソケットを開き、リッスンしているコンピューター (ソフトウェア サーバー) への接続を試みます。

Qt5 のバインド機能を使用して、1 つの TCP ソケットを eth0 IP アドレスにバインドし、別の TCP ソケットを eth1 IP アドレスにバインドします。これが PING や SCP 経由のファイル転送などの他のプログラムで動作することを確認しました。http://qt-project.org/doc/qt-5.0/qtnetwork/qabstractsocket.html#bindを参照してください

bind を呼び出すと、呼び出しは成功し、ローカル IP アドレスに対する後続の要求は正しい値を返します。たとえば、socket->bind(ip) は true を返し、socket->localAddress() は ip に等しくなります。ただし、connectToHost を呼び出すと、接続の試行を開始したときに localAddress が失われ、接続後に必要な localAddress とは異なる localAddress が設定されます。

何が起こっているのか誰にも光を当てることができますか? これらのプログラムは非常に大きいため、ソフトウェアクライアント/サーバーの役割を逆にするためにソフトウェアを書き直すことは避けようとしています。助けてくれてありがとう。

4

1 に答える 1

0

これについては、Qt プロジェクトのバグ トラッカーに未解決のバグがあります。

于 2013-04-22T02:23:06.763 に答える