2

Qt 4.8のドキュメントには、次のアドバイスが含まれています。

標準の QIODevice 関数 read()、readLine()、write() などを使用する場合は、最初に connectToHost() を呼び出してソケットをピアに直接接続する必要があります。

だから私は次のコードを試しました:

udp.connectToHost(hostName, hostPort);   // connected
udp.bind(hostName, hostPort);

このコードを実行すると、Qt は次のデバッグ メッセージをログに記録します。

QNativeSocketEngine::bind() は QAbstractSocket::UnconnectedState で呼び出されませんでした

つまりbind、ソケットが未接続状態である必要があります。だから私は次のことを試しました:

udp.bind(hostName, hostPort);  // bound
udp.connectToHost(hostName, hostPort);

しかし、それも機能しません。ソケットはホストに接続されず、エラー状態のままです。

QIODevice として使用するために QUdpSocket を構成する正しい方法は何ですか?

4

1 に答える 1

4

最初にソケットを特定のローカル アドレス/ポートにバインドし、次にソケットを特定の外部アドレス/ポートに接続する方法が機能するはずです。したがって、2 番目のコード例は正しいものでした。

udp.bind(hostName, hostPort);  // bound
udp.connectToHost(hostName, hostPort);

しかし、これはバージョン < 5.5.0 の Qt では機能しません。内部で使用される関数はconnectToHost常に最初にソケットのバインドを解除し、任意のアドレスの空きローカル ポートに再度バインドするためです。

詳細については、QTBUG-26538 - QUdpSocket: connectToHost() が bind() で指定されたローカル ポート番号をリセットするを参照してください。

再実装されたメソッドを使用するために、UDP ソケットが特定の外部名/ポートへの「接続」(UDP はコネクションレス) で特定のローカル アドレス/ポートにバインドされていることが重要な場合QIODevice、この Qt に他の回避策を提供することはできません。 Qt バージョン < 5.5.0 のバグは、 Qt 5.5 コミット メッセージ 102610のページで確認できる、適用されたパッチのコードを使用して、使用されている Qt バージョンのソースに (非常に慎重に) パッチを適用するよりも優れています。

于 2015-03-13T15:28:36.717 に答える