gpt4 book ai didi

c++ - Qt QIODevice::write/QTcpSocket::write 和写入的字节

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:15 29 4
gpt4 key购买 nike

我们对 QIODevice::write 的一般行为和具体的 QTcpSocket 实现感到非常困惑。有一个 similar question已经,但答案并不令人满意。主要的混淆源于分别提到的 bytesWritten 信号和 waitForBytesWritten 方法。这两个似乎表示从QIODevice使用的缓冲区写入实际底层设备的字节(必须有这样的缓冲区,否则该方法没有多大意义)。那么问题是,如果 QIODevice::write 返回的数字与这个数字相对应,或者如果在那种情况下它表示存储的字节数内部缓冲区,而不是写入底层设备的字节。如果返回的数字指示写入内部缓冲区的字节数,我们将需要采用如下模式来确保写入所有数据:

void writeAll(QIODevice& device, const QByteArray& data) {
int written = 0;
do {
written = device.write(data.constData() + written, data.size() - written);
} while(written < data.size());
}

但是,如果 QIODevice::write 的返回值与 bytesWritten 信号的含义一致,这将插入重复数据。文档对此非常困惑,因为在这两种方法中都使用了 device 这个词,尽管它看起来合乎逻辑并且是一般理解,实际上表示写入缓冲区,而不是设备。

总而言之,问题是:QIODevice::write 返回的数字是写入底层设备的字节数,因此保存调用 QIODevice::write 没有检查返回的字节数,因为所有内容都存储在内部缓冲区中。或者它是否表明它可以在内部存储多少字节,并且必须采用类似上述 writeAll 的模式才能将所有数据安全地写入设备?

(更新:查看源代码,QTcpSocket::write 实现实际上永远不会返回少于想要写入的字节数,因此不需要上面的 writeAll .不过,那是特定于socket和这个Qt版本的,文档还是比较困惑...)

最佳答案

QTcpSocket 是一个缓冲的 QAbstractSocket。在 QAbstractSocket 中分配了一个内部缓冲区,数据被复制到该缓冲区中。 write 的返回值是传递给 write() 的数据的大小。

waitForBytesWritten 等待,直到 QAbstractSocket 的内部缓冲区中的数据写入 native 套接字。

关于c++ - Qt QIODevice::write/QTcpSocket::write 和写入的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7512559/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com