this postに基づいてQTcpServerを書きました。ソケットは、QByteArrayの合計バイトを最初の4バイト(qint32)に挿入します。QTcpServer - クライアントが奇妙なデータサイズを受信しました
static inline QByteArray IntToArray(qint32 source);
QByteArray IntToArray(qint32 source) {
QByteArray temp;
QDataStream data(&temp, QIODevice::ReadWrite);
data << source;
return temp;
}
void multisocket::write_socket(const QJsonObject &obj){
QJsonDocument doc(obj);
QByteArray array(doc.toJson());
qint32 size = array.size();
qDebug() << "sending..." << size << array.size();
QByteArray total = IntToArray(size);
socket->write(total);
socket->write(array);
qDebug() << socket->waitForBytesWritten();
}
サーバー出力:
write_socket sending... 22299 22299
write_socket true
はクライアント:すべては罰金
サーバーに見えクライアントで
を、私はループを作り、合計を確認しますサイズ。 合計が到着するまで、受信進みます
static inline qint32 ArrayToInt(QByteArray source);
void network_controller::read_all_buffer(){
QByteArray buffer;
qint32 size = 0;
while (s->bytesAvailable() > 0)
{
buffer.append(s->readAll());
while ((size == 0 && buffer.size() >= 4) ||
(size > 0 && buffer.size() >= size)){
if (size == 0 && buffer.size() >= 4)
{
size = ArrayToInt(buffer.mid(0, 4));
buffer.remove(0, 4);
}
if (size > 0 && buffer.size() >= size)
{
QByteArray data = buffer.mid(0, size);
QJsonObject obj = socket_ba_to_json(data);
emit network_callback(obj);
}
}
}
}
問題:クライアントでを、最初のバイトのサイズは大丈夫そうです。サーバーとクライアントから22299を受信しましたが、ループが停止せず、バッファーサイズが増加します。私は何が欠けているのですか?
クライアント出力:
read_all_buffer Receiving: 22299 1460
read_all_buffer Receiving: 538976288 8760
read_all_buffer Receiving: 538976288 4380
read_all_buffer Receiving: 808192544 1460
read_all_buffer Receiving: 538976288 2920
read_all_buffer Receiving: 1381979713 3323
他の時間。物事のようなものがそこに間違っていた。 –
バッファがクリアである必要があります。 –
@ShiheZhangご回答ありがとうございます。問題はスコープに関するものだと私は思う。 –