我们对QIODevice::write一般行为和QTcpSocket具体实施感到困惑.已经有类似的问题,但答案并不令人满意.主要的混淆源于那里提到的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());
}
Run Code Online (Sandbox Code Playgroud)
但是,如果返回值QIODevice::write与bytesWritten信号的含义相对应,则会插入重复数据.文档对此非常困惑,因为在两种方法中都使用了" 设备"这个词,即使它似乎是逻辑和一般的理解,一个实际上表示写入缓冲区而不是设备.
总而言之,问题是:数字是否返回QIODevice::write写入底层设备的字节数,因此保存到调用QIODevice::write 而不检查返回的字节数,因为所有内容都存储在内部缓冲区中.或者它是否表明它可以在内部存储多少字节,并且writeAll必须采用类似上述的模式来安全地将所有数据写入设备?
(更新:看一下源代码,QTcpSocket::write实现实际上永远不会返回比想要写的更少的字节,所以writeAll不需要上面的内容.但是,这是特定于套接字和这个Qt版本,文档仍然令人困惑...... )
小智 5
QTcpSocket是缓冲的QAbstractSocket.内部分配内部缓冲区QAbstractSocket,并在该缓冲区中复制数据.write的返回值是传递给的数据的大小write().
waitForBytesWritten等待,直到内部缓冲区中的数据QAbstractSocket写入本机套接字.