問題タブ [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 投票する
1 に答える
641 参照

c++ - QTcpSocket を使用して大きなファイルを転送中に「メモリがいっぱいになりました」

bytesWrittenfunctionに接続して、ブロックしない方法で大きなファイルを転送しようとしていますsendNextBlock

このコードを Symbian 電話で実行しています。5 ~ 6 メガバイトが転送された後、電話に「メモリがいっぱいです」というメッセージ ボックスが表示され、デバッグ出力に次のメッセージが表示されます。

これはある種のメモリ リークだと思いますが、コードで何が原因なのかわかりません。

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

connection - QTcpSocketはQTcpServerに誤って接続します

しばらくの間、私はQtを使用してきました(英語で申し訳ありません)。現在、QtNetworkを使用しています。

システムのようなクライアントサーバーを作成する必要があります。基本的な考え方は次のとおりです。

  • 両方(クライアントとサーバー)のIPは変更される可能性があります。サーバーIPをクライアントの構成ファイルに保存する方法はありません。したがって、サーバーは何らかの方法でIPを公開する必要があり、クライアントは接続するサーバーIPを検出できる必要があります。

  • クライアントは、サーバーがなくても動作し、サーバーを(接続すると)動作を更新できる必要があります。

  • クライアントとサーバーは同じWLANネットワークで実行されているため、インターネット経由で接続する必要はありません。

  • この新しいシステムは、古いシステム(また、クライアントとサーバー)を置き換えることを目的としています。古いサーバーはUDPブロードキャストメッセージのみを使用してクライアントと通信するため、メッセージが失われることがあります。

したがって、最初のポイントとして、サーバーにタイマーを実装しました。このタイマーは、X回ごとに、「サーバーに接続」というメッセージを含むブロードキャストメッセージをUDP経由で送信します。このメッセージの考え方は、クライアントがそのようなメッセージを検出し、サーバーIPを接続させることです。

サーバーはQTcpServerを使用してクライアント接続を検出し、クライアントごとに、通信するための新しいQTcpSocketを格納します。

クライアントは、サーバーIPを取得したら、TcpSocketを使用して接続します。

シンプルに聞こえます。

接続システムを実装しましたが、ローカルマシン(サーバーと同じマシン上で実行されている一部のクライアント)では、システムは問題なく動作します。接続が可能で、通信が機能します。クライアントとサーバーの両方が、gcc4.7.2を使用してChakraLinux64ビットでコンパイルされています。システムにインストールされているQtバージョンは4.8.4です。

ここで、2台の実マシン(Chakra Linux 64ビットで実行されているサーバーとWindows7(一部の32ビットと別の64ビット)および2台のWindows 8(32ビットのみ)で実行されているクライアント)でシステムをテストしました。クライアントのWindowsバージョンは、Qt4.8.3およびMingW4.6.2でWindows732ビットを実行している仮想マシン(VirtualBox 4.2.4)でコンパイルされています。Windowsクライアントは、すべての32ビットコンパイル済みバージョンのクライアント(すべての32ビットWindowsマシンと64ビットWindowsマシン)を実行します。

クライアントはブロードキャストメッセージ(UDP、ポート45454で動作)を検出して読み取ることができ、サーバーIPを取得すると(検出されたIPは正しい)、接続を試みます。

問題は、7つのクライアントから、1つのWindows8だけが一度接続したことです。すべてのクライアントが接続を試み、そのすべてのQTcpSocketが「接続済み」信号を送信しますが、サーバーは接続を検出しません。

1つまたは2つのクライアントを接続できる場合があるため、これは完全にランダムです。それ以外の場合はありません。

このコードは、クライアントブロードキャストの初期化用です。

このコードは、サーバーブロードキャストメッセージを受信するときのクライアントからのものです。

サーバー側では、次のコードを初期化する必要があります。

そして、これは新しいクライアントを接続するためのコードの一部です。

「sendToClient」メンバー関数は、接続されるとクライアントにメッセージを送信するだけです。

したがって、問題は、なぜそれほどランダムな接続があるのか​​わからないことです。ほとんどの場合、誤った接続です(クライアントも接続された信号を送信しますが、サーバー側では、クライアントが送信されたときに信号が送信されません。接続します...)。

何が間違っているのかわかりません...

クライアントとサーバーの両方がUDPポート45454とTCPポート8888で動作します。私はすでにTCPポート値(クライアント、サーバー、および両方)を変更しており、同じ話をしています。TCPポートを変更しましたが、両方に同じポートがない場合、メッセージはクライアントに到達しません...

長いテキストで申し訳ありませんが、私が何をしたかをお伝えするのが最善だと思います...

私は、1つが私の問題になる可能性があるか、または私のコードに問題があるかどうかのアドバイスを探しています...しかし、時々(そして時々)1つまたは2つのクライアントが実際に接続できることを覚えておいてください...

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

c++ - 転送を受信するQTcpSocket

送金の受け取りに問題があります。

QTcpSocket-> readAll()は、送信時に十分なバイトを読み取りません。15kバイトを送信すると、その一部のみが読み取られ、何も実行されません。私は何が間違っているのですか?

なぜこれが起こるのですか?

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

c++ - QThreadとQTcpSocket

あるプロジェクトをやっていたときに重大な間違いを犯したので、下から再プログラムする必要があります。接続やリクエストなどを処理するマルチスレッドサーバーを作成しています。しかし、ベースを使用して新しいクラスを作成したときQThreadのオブジェクトで、QThread-> start()ではなくQThread-> run()でスレッドを開始していました。今、私はたくさんのエラーを受け取ります。これが状況です。接続ごとに新しいスレッドを作成し、接続されている各クライアントからデータの読み取りを開始するサーバーがあります。データを受信すると、メインGUIクラスに接続されている信号を送信し、結果OKを表示します。また、メッセージに返信するためのソケットハンドルも保存されます。GUIクラスからソケットにデータを書き込むと、次のようになります。

QObject:別のスレッドにある親の子を作成できません。(親はQNativeSocketEngine(0x23a6c38)、親のスレッドはMyThread(0x1fb8670)、現在のスレッドはQThread(0x9eb980)

どうしたの?

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

c++ - 既存のQTcpSocketをQSslSocketにモーフします

TCP接続を中断または閉じることなく、新しいQSslSocketを作成して、既存のTCP接続の所有権を取得し、古いQTcpSocketを破棄することは可能ですか?

FTPサーバーに明示的なFTPSを実装するためにこれが必要です。これには、最初に接続が暗号化されていないことが必要であり、FTPクライアントの要求(コマンドAUTH SSLまたはAUTH TLS)があった場合にのみ、SSL/TLSハンドシェイクが開始されます。

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

c++ - QTcpSocket はその記述子を解放できますか

QTcpSocket がその記述子を解放して、ソケットの所有権を別のスレッドの別の QTcpSocket オブジェクトまたは QSslSocket に、ソケットを閉じたり中断したりせずに転送できるようにすることは可能ですか?

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

qt - QtConcurrent ::runを使用したQtQTcpSocketには、別のスレッドでのイベントループが必要です

Qtに非常に大きな(〜1Gb)ファイルを読み取り、QTcpSocketを介してデータをリクエスターに返すWebサーバーがあります。このソケットは、メインサーバースレッドによって作成されます。QtConcurrentを使用して、このソケットをワーカースレッドに渡し、そこにデータを送り返したいと思います。

'returnPartialLargeFile'関数は次のようになります。

私が得るエラーは、'loop.exec()'行をコメントアウトしたままにすると、次のエラーが発生することです。

コメントを外すと、ここでの関数はexec()行で短絡し、ソケットにデータを書き込んだりデータを書き込んだりすることはありませんが、エラーは発生しません。whileループからのデータを含まない切り捨てられた応答を取得するだけです。 。

ソケットの親を変更して新しいスレッドに移動しているので、問題がイベントループとソケットの信号とスロットだけにあることを願っています。私がここで間違っていることについて何か考えはありますか?どうすればこれを機能させることができますか?信号/スロットの問題が発生した場合、ここで接続する必要があるのはどれですか?ありがとう -

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

multithreading - 実行されたタスクを削除するとQtアプリがクラッシュする

マルチスレッドサーバーがあります(QTcpServerを継承します)。新しい接続が表示されたら、新しいタスクを作成し(QRunnableを継承)、ソケット記述子をコンストラクターに渡し、このタスクをQThreadpool(3つのワーカーを持つ)にプッシュします。

run()で、QTcpSocketを動的に作成し、ソケット記述子を設定して、最初に受信したバイトを読み取ります。このバイトの値に基づいて、新しい特定のタスクを作成し(QRunnableも継承します)、以前に作成したQTcpSocketオブジェクトへのctrポインターを渡し、このタスクをQThreadpoolにプッシュします。

この特定のタスクにより、ルーチンとアプリがクラッシュします。ログファイルから、この特定のタスクのデストラクタが呼び出されたことがわかります。

また、QtCreatorは次のエラーメッセージをスローします。

QObject:別のスレッドにある親の子を作成できません。(親はQNativeSocketEngine(0x18c62290)、親のスレッドはQThread(0x18c603e0)、現在のスレッドはQThread(0x18cc3b60)QSocketNotifier:ソケット通知機能を別のスレッドから無効にすることはできませんQCoreApplication :: sendEvent:"が所有するオブジェクトにイベントを送信できません別のスレッド。現在のスレッド18cc3b60。レシーバー''(タイプ'QNativeSocketEngine')はスレッド18c603e0 "、ファイルkernel / qcoreapplication.cpp、行420で作成されました。

同様の投稿を見つけましたが、残念ながら問題の解決方法がわかりませんでした。私を助けてください。

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

multithreading - 各 TCP 接続を個別のスレッドで処理すると、レイテンシが改善されますか?

QTcpServer と QTcpSocket の上に実装された FTP サーバーがあります。

スレッドが 1 つしかない場合でも、シグナルとスロットのメカニズムを利用して、複数の TCP 接続を同時にサポートします。私のコードはできるだけ早くイベント ループに戻り、ブロックせず (待機関数なし)、ネストされたイベント ループをどこにも使用しません。そうすれば、Win3.1 アプリケーションが持っていたように、私はすでに協調マルチタスキングを持っています。

しかし、他の多くの FTP サーバーはマルチスレッド化されています。各 TCP 接続を処理するために個別のスレッドを使用すると、パフォーマンス、特にレイテンシが向上するかどうか疑問に思っています。

一方では、新しい接続ごとに新しいスレッドを開始する必要があるため、スレッドはレイテンシーを増加させますが、他方では、私の協調的マルチタスクでは、他の TCP 接続は、readyRead()/bytesWritten()シグナルの前にメインループに戻るまで待機する必要があります。扱うことができます。

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

qt - QTcpSocket または QSslSocket を介して QDataStream を送信する

シリアル化されたデータを ssl または tcp ソケット経由で送信したい。QIODevice::write は QDataStream を送信せず、char* と QByteArray のみを送信します。

シリアル化されたデータをソケット経由で送信する方法はありますか? QDataStream を QByteArray に変換するにはどうすればよいですか?

ありがとう