問題タブ [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.
qt - サーバーからデータを受信するQTcpSocket
QTcpSocket から未知の形式のデータを読み取ることは可能ですか?
つまり、TCP クライアントとサーバー アプリケーションがあります。どちらも QDataStream を使用してデータ パケットを正常に交換しています。
他のアプリケーション(私が作成したものではない)が同じIPとポートを介してサーバーにデータを送信すると、データを読み取ることができますか?
QDataStream を使用して記述されていない限り、それを読み取ることができないことはわかっていますが、受信データをダンプして、その形式のデータを受け入れるようにコードを変更するにはどうすればよいですか?
最後に私の質問ですが、QTcpSocket を使用するサーバー/クライアント アプリケーションは、未知のクライアント/サーバー アプリケーションからデータを読み取る (ダンプする) ことができますか?
誰も混乱させなかったことを願っています。
qt - QTcpSocketでファイルを転送するときの奇妙な文字
QTcpSocketを使用してファイルを転送しようとしています。接続は正常に実行されますが、受信したバイトをファイルに記録しようとすると問題が発生します。ファイルを開くと、ファイルの先頭に奇妙な文字がいくつかあります。これらのキャラクターは何ですか?
qt - TCP ソケット通信が破損しています
TCP サーバーを使用して、QTcpSocket クライアントで接続しようとしています。ほとんどの場合、サーバーとクライアントはたまたま同じマシン上にありますが、これは必須ではありません。私がやろうとしているのは、実行中のマルチスレッド プロセスから、サーバーとクライアントの両方で使用される情報を共有したい GUI にファイルを転送することです。
接続などは問題ないようです。実際、コードは長い間完全に機能しているように見えましたが、別のハードウェアで実行しているため、10.04 ではなく Ubuntu 12.04 で、受信したコードに浮遊バイトが埋め込まれていることがあります。常に) null。何が悪いのかわかりません。アドバイスをいただければ幸いです。
ファイルを読み取り、接続されたクライアントにバイトを送信するサーバーの一部を次に示します。
ここで、送信されているデータを読み取ります。これは、readyRead 信号に接続されたスロットです。
c++ - QTcpSocket からの readyRead() シグナルを見逃さないようにするにはどうすればよいですか?
を使用QTcpSocket
してデータを受信する場合、使用するreadyRead()
信号は で、新しいデータが利用可能であることを示します。ただし、データを読み取るために対応するスロット実装にいる場合、追加は発行されませんreadyRead()
。これは、利用可能なすべてのデータを読み取っている関数に既に入っているため、理にかなっています。
問題の説明
ただし、このスロットの次の実装を想定しています。
readAll()
呼び出し後、スロットを離れる前にデータが到着した場合はどうなりますか? これが他のアプリケーションによって送信された最後のデータ パケット (または、少なくともしばらくの間最後のデータ パケット) である場合はどうなるでしょうか? 追加の信号は発行されないため、すべてのデータを自分で読み取る必要があります。
問題を最小限に抑える 1 つの方法 (ただし、完全に回避するわけではありません)
もちろん、次のようにスロットを変更できます。
ただし、問題は解決していません。-checkの直後にデータが到着する可能性は依然としてありますsocket->bytesAvailable()
(関数の絶対的な最後に /another チェックを配置しても、これは解決されません)。
問題を再現できることを確認する
もちろん、この問題はめったに発生しないため、スロットの最初の実装に固執し、人工的なタイムアウトを追加して、問題が確実に発生するようにします。
次に、別のアプリケーションに 100,000 バイトのデータを送信させます。これが起こることです:
新しいつながり!
32768 (または 16K または 48K)
メッセージの最初の部分は読み取られますが、再度呼び出されることはないため、最後は読み取られませんreadyRead()
。
私の質問は次のとおりです。この問題が発生しないことを確認する最善の方法は何ですか?
考えられる解決策
私が思いついた解決策の 1 つは、最後に同じスロットを再度呼び出し、スロットの先頭で読み取るデータがあるかどうかを確認することです。
スロットを直接呼び出すのではなく、 を使用するため、スロットを再度呼び出していることを が認識できないQTimer::singleShot()
と想定しているため、発行されない問題はもう発生しません。QTcpSocket
readyRead()
パラメーターを含めた理由bool selfCall
は、によって呼び出されたスロットがQTcpSocket
すぐに終了することが許可されていないためです。そうしないと、同じ問題が再び発生する可能性があり、データが正確に間違ったタイミングで到着し、送信されreadyRead()
ません。
これは本当に私の問題を解決するための最良の解決策ですか? この問題の存在は Qt の設計エラーですか、それとも何か不足していますか?
c++ - Qt の QTcpSocket ReadyRead シグナルの実装
QTcpSocket
のReadyRead
シグナルの Qt の実装について知りたいです。Windows と Linux ではどのように実装されていますか? select()
、poll()
、epoll()
、SIGIO
またはその他の方法を使用していますか? シグナルを発するタイミングをどのようにQTcpSocket
知るのReadyRead
ですか?
c++ - QTcpSocket: 大きなファイルを送信するときの複数の ReadyReads
QTcpSocket を使用して 1MB のファイルを 200KB/秒 (5 秒転送) で送信したいと考えています。ReadyRead スロット関数は、最初にファイル サイズ (ヘッダー) を読み取り、次にソケットから file_size バイトを読み取りながらブロックするスレッドを開始します。しかし、readyRead スロット関数はファイル転送が終了する前に終了するため、readyRead 関数の新しい呼び出し (新しい ReadyReads の発行) が干渉することはありませんか?
私はここで読んだ: QTcpSocket からの readyRead() シグナルを見逃さないようにする方法は? スロット関数にいる間は、新しい ReadyReads は発行されません。
qt - QSocketNotifier: 別のスレッドからソケット通知機能を無効にすることはできません
スレッド間で QTcpSocket と通信できないことは承知していますが、何が間違っているのかわかりません。
他のスレッドにあるQTcpSocketにデータ送信信号を送信するとすぐに、QSocketNotifierはそれ自体を無効にして、QTcpSocketがデータを読み取れるようにする必要があります。上記のエラーが発生するため、無効にならず、readyRead() シグナルが発行されません。
QEventLoop を使用して、メイン ループをロックせずにブロック メカニズム (同期通信 - ModBus プロトコル) を実装しています。過去にその関数に問題があったため (タイムアウト)、waitReadyRead() を使用できません。
https://bugreports.qt-project.org/browse/QTBUG-24451
と
https://bugreports.qt-project.org/browse/QTBUG-14975
なぜ私がこれほど多くのスレッドをセットアップするのか、興味がある人もいるでしょう。
Thread1: 新しい通信ごとに新しいスレッドが作成され、それを「グローバル」ミューテックスでロックして、他の関数が並列通信を実行しないようにします。そのスレッド内 - 準備とミューテックスのロックの後、Thread2 にある Qt::QueuedConnection シグナル (デバイスとの常時通信) によって QTcpSocket と通信します。
Thread2: QTcpSocket オブジェクトが作成され、スレッドに移動されました。デバイスに接続したら、ソケットを閉じたくありません。メイン イベント ループをブロックしているため、QTcpSocket からのシグナルを実行するには他のイベント ループが必要です。
そしてコード:
だから私が言ったように、スロット TcpSocketClient::readyRead() は呼び出されず、出力にメッセージが表示されます:「QSocketNotifier: ソケット通知を別のスレッドから無効にすることはできません」。
このコードを置き換えると:
と:
そのため、プログラムはスレッドにプッシュされず、メイン スレッドで実行されます (違いのみです!)。その後、すべてが正常に機能します。readyRead スロットはループ ブレークで機能し、データを取得します。mcr->execute 内に mutex.lock() を設定しているため、ModbusCommandReply をスレッドとして実行する必要があります。そのため、プログラムの他の部分でメソッド execModbusCommand を実行するたびに、他のスレッドがリソースを解放して通信を確立するまで停止します。
「QSocketNotifier: ソケット通知機能を別のスレッドから無効にすることはできません」と表示される理由がわかりません - 新しいオブジェクトをヒープに配置してスレッドが開始された後、THREAD_2 内に QTcpSocket を設定しました: tcpSocket_ = new QTcpSocket(this);
どんな助けにも感謝します、ありがとう!
c++ - コードが QTcpSocket で利用可能なバイト数を読み取れないのはなぜですか? アイデア?
QTcpSocket (nntp は QTcpSocket へのポインター) からデータを読み取るループの本体に、次のコード スニペットがあります。
断続的に、これは次のようなものを出力します。
そして、そこからの私のコードは誤動作します。これは私には非常に奇妙に思え、QTcpSockets の仕組みを完全に誤解していることを示唆しています。確かに、bytesAvailable > 0 の場合、後続の読み取りは、bytesAvailable バイトをバッファに読み込むことができることを意味します。この場合、bytesRead は == bytesAvailable である必要があります。または、何か不足していますか?私の現在の疑いは、それがある種のメモリ破損である可能性があるということです..
編集:いくつかの nntp.errorString() メッセージをスローすると、この失敗中に「ネットワーク操作がタイムアウトしました」と報告されます。これが何を意味するのか調査する必要があります...(アイデア?)
EDIT 2:「ネットワーク操作がタイムアウトしました」は、読み取りがタイムアウトしたことを意味しているようです。コードが正常に (断続的に) 動作する場合でも、この「エラー」が発生します。
編集 3: 上記のコード スニペットの完全なアルゴリズム コンテキストは、このペーストビンのリンクにあります。
EDIT 4: EDIT 3 の関数のわずかに異なるバージョンですが、それでも同じ問題がありますが、この新しいペーストビン リンクにあります。
c++ - QTcpServer に特定のポートでリッスンさせる方法は?
QTcpServer に 1024 より小さい特定のポートをリッスンさせることはできますか?