2

私はQtが初めてなので、これが完全にばかげた質問であれば...

QTcpSocket を使用しようとしています。

私が行った場合:

...
QTcpSocket * socket
socket = new QTcpSocket(this);
socket.write(1);
...

write() が整数 (const char * ではない) で機能しないことについて不平を言っています。

私が行った場合:

...
QTcpSocket * socket
socket = new QTcpSocket(this);
socket.write("1");
...

反対側はそれを整数 49 (1 の場合は ASCII) と見なします。

類似しているが異なる問題で、QTcpSocket を介して構造体または共用体を送信することは可能ですか?

==================================================

編集

サーバーはすでに整数を受け入れており、整数を期待しています-私はそれを制御できません。

4

4 に答える 4

4

ソケットでQDataStreamを使用することをお勧めします。これにより、リトル エンディアン/ビッグ エンディアンの変換の問題を回避できます。

以下のようなもの:

qint32 myData = 1;
QDataStream os( &mySocket );
os << myData;
于 2011-08-17T06:10:58.243 に答える
4

あなたが抱えている問題は実際には Qt とは関係ありません。他のソケットまたはストリーミング インターフェイスでも同じ問題が発生します。

サーバーのプロバイダーは、プロトコルの説明を提供する必要があります。この説明には通常、使用されるポート (TCP、UDP、番号)、その他の TCP パラメータ、および送信データのコーディングが含まれます。時々、このプロトコル (またはその実装) は (プロトコル) スタックと呼ばれます。

コーディングには、バイトの順序だけでなく、複雑な構造がどのように送信されるかの説明も含まれています。後者の情報は、多くの場合、「ASN.1」(抽象構文記法) と呼ばれるものでコード化されます。

サーバーが非常に単純で、メタ情報なしで次々と整数を受け入れ、同じプラットフォーム上にある場合は、次のようなことができます。

foreach (int i in my set of integers)
{
   ioDevice->write((const char*) &i, sizeof(i));
}

整数のアドレスをデータ バッファーの開始として取得し、整数と同じ数のバイトを送信します。ただし、Intel アーキテクチャから 16 ビット アーキテクチャまたは Motorola PPC にデータを送信すると、これは失敗することに注意してください。

于 2011-08-16T18:16:37.947 に答える
1

文字列表現で書くときは、反対側の文字列も解釈する必要があります。たとえば、QString::toInt()があります。

整数を整数として書き込みたい場合、送信に必要なバイト数が少なくなるため、スループットが向上します。ただし、ネットワーク バイト オーダーのトピックについて読む必要があります。

原則として、構造体などをバッファにコピーしたり、ネットワーク経由でコピーしたりすることができます。ただし、異なるアーキテクチャ間でデータを送信したり、ソフトウェアの異なるビルドのみを送信したりすると、事態は再び複雑になります。したがって、生データを送信するのではなく、シリアル化を使用してください。この質問を参照してください: Qt によるシリアル化

オブジェクトからストリームを生成する方法と、ストリームからオブジェクトを生成する方法についての回答を提供します。これらのストリームは、ネットワーク経由で送信するために使用するものです。そうすれば、整数自体を扱う必要はもうありません!

于 2011-08-16T16:11:48.497 に答える