はい、CRLFを使用するWindowsとLinuxの間にはいくつかの違いがあります。これは「正常」です。
うまく機能する1つのアプローチは、バッファを利用して、データの準備ができるかタイムアウトするのを待つことです。たとえば、セパレータトークンは「\ r」にすることができ、ドロップした後に「\n」を取得した場合も同様です。
カスタムプロトコルからのトークンを期待する例を次に示します。
int Connection::readDataIntoBuffer(int maxSize)
{
if (maxSize > MaxBufferSize)
return 0;
int numBytesBeforeRead = buffer.size();
if (numBytesBeforeRead == MaxBufferSize) {
abort();
return 0;
}
while (bytesAvailable() > 0 && buffer.size() < maxSize) {
buffer.append(read(1));
if (buffer.endsWith(SeparatorToken))
break;
}
return buffer.size() - numBytesBeforeRead;
}
http://doc.qt.nokia.com/stable/network-network-chat-connection-cpp.htmlを参照してください
必要なものに応じて、別の提案は、いくつかの標準プロトコルに固執することです。このように、さまざまなタイプのクライアントでテストできます。
カスタムプロトコルに固執したい場合は、独自のクライアントを作成し、サーバーと連携するための適切なテストケースを作成することをお勧めします。Qtはそれを簡単かつ高速にします;)ネットワークの例を見てください。
編集:
readline()
の代わりに検討することもできread()
ます。read()の代わりに改行を待ちます(以下のドキュメントの抜粋を参照してください)。ただし、これでは、回線をいつ終了するかを制御できなくなります。QTcpSocket
QIODevice
qint64 QIODevice::readLine ( char * data, qint64 maxSize )
ドキュメントから:
次のいずれかの条件が満たされるまで、データが読み取られます。
- 最初の'\n'文字が読み取られます。
- maxSize-1バイトが読み取られます。
- デバイスデータの終わりが検出されます。
Qtの秘密の要素は、非同期信号駆動設計です。いくつかのアイデアについては、記事「スレッド、イベント、およびQObject」の「ネットワーク/ステートマシン」セクションを参照してください。