QTcpSocket::write(QByteArray& buf) 的返回值是什么?

3

这个函数是否总是返回buf.size()或者-1?如果不是,我需要重新调用该函数以写入未被写入的数据吗?

例如,如果我有一个100字节大小的QByteBuffer。当我调用“tcpSocket.write(buf_100_bytes)”时,我是否可能得到60或其他值?

此外,这个函数是否立即返回?


@Frank Osterfeld:谢谢您的警告,这不是我真正的意图。我会注意的。我以前曾尝试为其他人投票或接受答案,但该网站警告我没有足够的权限,因此我认为只有回答了足够问题的人才能投票...也许我需要阅读StackOverflow的常见问题解答 :) - jnblue
2个回答

3
与POSIX write()类似,QIODevice::write()返回写入的字节数。这可以是0到缓冲区大小之间的任何数字。此外,在出现错误的情况下,它可能会返回负数,您需要单独检查。 对于套接字,QIODevice::write()不会阻塞(它们设置为非阻塞模式),字节只是添加到缓冲区并稍后写入。 要在写入字节时收到通知,可以连接到bytesWritten(qint64)信号。要阻塞直到实际写入字节,请使用waitForBytesWritten()(通常不建议在主/UI线程中使用)。

给 Frank 的帖子点个赞。我只想补充一下,POSIX 是 *nix 系统的 API,但我相信 Windows 的算法也类似。 - Barbaris
非常感谢!如果它不是针对套接字进行阻塞,那么这是否意味着 "write(something); something=NULL;" 不安全?因为当系统实际上想要写入数据时,但数据被设置为 NULL... - jnblue
好的,我明白了,我上一个评论很蠢:),如果我这样做是安全的,因为系统会将数据深度复制到套接字缓冲区。谢谢! - jnblue

0

我引用Qt文档:

从数据data中写入最多maxSize字节到设备中。返回实际写入的字节数,如果发生错误则返回-1。

这意味着它将返回已写入的字节数或-1(如果出现错误)。您可以通过调用error()方法或连接到error()信号来获取错误信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接