問題タブ [qtcpsocket]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1387 参照

c++ - QTcpSocketはデータの構造体を書き込みます

以前はC++ソケットを使用して構造体を送信していましたが、現在は代わりにQTcpSocketsを使用しようとしています。これは構造体です:

それで、書くために私は以前電話をしていましたwrite(sockfd, &messageToSend, uiMessagePcToMastSize);

今私は試しています:socket->write(&messageToSend, uiMessagePcToMastSize);そして動作しません:'QTcpSocket :: write(mastControl :: st_messagePcToMast *、const unsigned int&)を呼び出すための一致する関数がありません。

さらに情報を検索しましたが、構造体をQDataStrem、または単にQByteArrayに変換する必要があるようです。私はこれをどうやってデルするのか本当にわかりません。

何か助けはありますか?

0 投票する
2 に答える
6296 参照

c++ - 別のスレッドにある親の子を作成できません

MyThread.cppと.hで定義されたQThreadがあります。そこに私的なQTcpSocketがあります。

一方、Functions.cppと.hで定義された一連の関数があります。これらは、Functionsクラスではなく、名前空間に定義されています。

次に、間違っている場合は修正します。関数を関数に呼び出してMyThreadのQTcpSocketをホストに接続すると、同じスレッドにいると思います。これは、自分が持っているスレッドから関数を呼び出しているためです。作成されたものであり、別のものではありません。

それにもかかわらず、socket-> connectToHostでQObjectを取得しています:別のスレッドにある親の子を作成できません。2回。

何故ですか?どうしたの?

0 投票する
1 に答える
1820 参照

c++ - QTcpSocketの読み取り

UNIX C ++ソケットとのソケット接続があり、接続後、完全なメッセージが得られるまでバイトごとに読み取るループがありました。受信するメッセージの最初の2バイトと、その長さ(15バイト)を知っています。したがって、関数は次のようになります。

今、私はQTcpSocketsで同じことを実装しています。接続が確立されたら、次のように呼び出します。

だから私はいくつかの情報が読めるようになるまで待ってから、findPacketを呼び出します。これは今ではほとんど同じで、バイトごとに読み取っています。

見た目はほとんど同じですが、機能しません。waitForReadyReadを待ったら、findPacketのループに入り、受信した最初の4バイトを読み取ることができます。その後、データは受信されなくなります。それはfindPacketのループチェックの内部に何度も何度も残りますが、read関数は常に0バイトの読み取りを返します。新しい情報は受信されません。サーバーが数ミリ秒ごとに同じパケットを送信しているため、これは不可能です。したがって、一部のデータが失われたとしても、最終的には何かを読み取る必要があります。

だから、私が間違っているのは何ですか?別の方法で待つ必要がありますか?読み取り関数が0バイトの読み取りを返すのを初めて待つ必要がありますか?この読み取り関数とC++ライブラリの関数の違いは何ですか?

0 投票する
4 に答える
27262 参照

c++ - QTcpSocketの状態は常に接続されており、イーサネットワイヤを抜いても

QTcpSocketがあり、ループを読み込んでいます。完全なパケットが読み取られるたび、またはエラーが発生するたびに、ループ内のソケットのステータスを手動で確認します。

de programを実行すると、接続されてループが開始されると、常にqDebug()<<"Socket status: connected. Looking for packets...";が出力されます。そして、waitForReadyReadいくつかのデータを読み取る準備ができるまで立ち往生します。

問題は、切断が検出されないことです。OSオプションからネットワークを切断した場合、またはイーサネットワイヤを抜いた場合でも、同じように動作します。ソケットの状態はQAbstractSocket::ConnectedStateに等しいため、続行されますが、もちろん何も受信しません。

disconnected()また、(最初の接続後の)信号を再接続機能に接続している切断を検出しようとしました:

ただし、このコードは実行されないため、シグナルが送信されることはありません。ソケットの状態は常にであるように見えるので、これは論理的ConnectedStateです。

再度接続すると、接続が復元され、データの受信が再開されますが、切断を検出してGUIに「切断済み」と表示したいのですが。

QTcpSocketがこのように動作するのはなぜですか?この問題を解決するにはどうすればよいですか?

編集:クラスコンストラクターでソケットを作成してから、prepareSocket関数の呼び出しを初期化しています:

0 投票する
1 に答える
1955 参照

c++ - 接続 (QT プロジェクト内) が機能しない

QT ライブラリを使用して、最初のマルチスレッド アプリケーションの作成を開始しています。

QTcpServer と QTcpSocket に関する qt ガイドに従って、このコンストラクターとの接続を作成するサーバー アプリケーションを作成しました。

これは、新しいクライアントが接続を試みるたびに新しいスレッドを作成する incomingConnection() 関数です。

さて、これは MyThreadClass です:

コードは正常にコンパイルされますが、(サーバーの起動後に) クライアントを起動すると、サーバーから次のエラーが表示されます。

その後、サーバーはクライアントからデータを受信できません。

誰かが何か考えがありますか?

事前に感謝 ダニエレ

0 投票する
1 に答える
374 参照

c++ - QTcpSocket の状態

QTcpSocket ライブラリに問題があります。

同じソケット接続を使用して同じクライアントと通信する 2 つのプログラムを作成しました。残念なことに、この方法では、プログラムが同時に書き込みを行った場合、クライアントはソケットによって 1 つの文字列 (通常は最初の文字列) のみを読み取ります。

したがって、送信する 2 番目の文字列を遅らせるために、ソケットがビジーかどうかを知る特定の関数 (または方法) が存在するかどうかを知る必要があります。

前もって感謝します。

0 投票する
2 に答える
6295 参照

c++ - どのQTcpSocketがreadyRead()信号を発行したかを知るにはどうすればよいですか?

QTcpServerとQTcpSocketがどのように機能するかを理解するのに役立つhello-worldプログラムを作成しました。その中で、QTcpServerは新しい接続を受け入れ、それらのreadyRead()信号をMainWindow::onNewData()スロットに接続し、そこで新しいデータがプレーンテキストコントロールに追加されます。

問題は、複数のソケットを同時に開くことができることです。それで、私がreadyRead()信号を受け取り、でデータを読みたいときreadAll()、どのソケットがそれを放出したかをどうやって知ることができますか?

コードの関連部分は次のとおりです。ここにはQTcpSocketポインターをまったく保存していませんが、保存したとしても、どちらが信号を発したのかわかりません。

0 投票する
1 に答える
1379 参照

newline - Qt QTcpSocket QByteArray/QStringの特殊文字と適切な構文の問題

Qtのいくつかの特殊文字に問題があります。2つは引用符と改行です。telnetを使用してサーバーに接続していますが、サーバーは何らかの理由で入力の最初と最後に自動的に引用符を付けます。引用符と改行の両方を削除するのに問題があります。

改行を置き換える際の問題を以下に説明します。

telnetからの私の入力:こんにちは

プログラムが改行を置き換えた後: "ello(引用符付きの通常の出力は" Hello "になります)

また、引用符を置き換えてもまったく効果はありません。正規表現であるため、二重の円記号も使用してみましたが、どちらも1つある場合と同じ問題があります。助けてくれてありがとう。

編集:これはqDebugのフォーマットであり、Telnetなどを使用した結果ではないことが判明しました。

0 投票する
1 に答える
6631 参照

qt - プロパティ バインディングが更新されない

アプリケーションの実行中に継続的にデータを取得していますが、データを読み込んでマップに保存すると、データを表示するのに少し問題があります。

QML でデータを表示しようとすると、アプリケーションの出力で更新されていることがわかるにもかかわらず、単にゼロが表示されます。

プロパティ バインディングを使用して QML の値にアクセスします (これらが変更headingSensorされるたびに更新されるという印象を受けましたcarData.headingSensorか?)。


私のデータクラスには次のものがあります。


私がもともと持っていたC ++の実装では:


受信情報で更新されているマップ内の値を返す場所。

プロパティは、正しい値が返されているにもかかわらず、それ自体が更新されていないheadingSensor変数に依存しているため、これはおそらく機能しないことに気付きました。そこで、headingSensor の値を更新して返すように変更すればうまくいくのではないかと考えました。

そのため、データ取得ロジックで、変数を更新するメソッドも作成しました。

これによりheadingSensor、マップ内の値に加えて変数が更新されましたが、QML ディスプレイには正しい値が表示されません。単純に表示されます0(受信データからまだ値を取得していないため、最初に表示されたときのデフォルト値)。

それで、QMLに表示されるsensorHeadingの値を取得して、その値および/またはマップの値がC ++で変更されると、どのように更新できますか? 次のようなことをする必要がありますか?

編集: このようなことをしようとすると、onSensorHeadingChanged は起動しません。アプリケーション出力で見ると、sensorHeading の値が明らかに変化するため、理由はわかりません。


0 投票する
3 に答える
13839 参照

c++ - QTcpSocket クライアントの自動再接続

サーバーが起動して準備が整うまで、QTcpSocketを使用して定期的にサーバーに接続しようとするコードを作成しようとしています。また、クライアントは、サーバーがダウンしている場合、サーバーが再起動するか、ユーザーが手動でプログラムを閉じるまで、自動的かつ定期的に再接続を試行する必要があります。

私が行ったことは、QTcpSocket の接続信号とエラー信号を購読することです。エラー信号をキャッチしたら、基本的に connectToHost メソッドを再度呼び出します。

私のコードは、サーバーの準備が整うまで定期的にホストへの接続を試みます (この部分は正常に動作します)。ただし、問題は、サーバーがダウンすると再接続できないことです。接続がダウンすると、期待どおり RemoteHostClosedError が発生します。しかし、同じメソッド内で connectToHost メソッドを再度呼び出した後 (RemoteHostClosedError をキャッチする場所)、何も得られませんでした。エラー信号でさえ QTcpSocket オブジェクトによって発行されません。

以下にコードを示しました。

}

connectToHost メソッドを呼び出す前後の QTcpSocket の状態を確認します (ここで指定した最後の行)。connectToHost を呼び出す前の状態は UnconnectedState であり、connectToHost を呼び出した後の状態は Connecting になります。予想外のことは何もありません。ただし、サーバーに接続することも、エラー信号を発することもできません。

何か案が?

注: QTcpSocket の connectToHost メソッドは、初めて内部的に呼び出されます。