gpt4 book ai didi

c++ - Qt5.2 QNetwork,写了多少字节?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:22 25 4
gpt4 key购买 nike

我正在使用 Qt5.2 开发网络软件,所以:

QTcpSocket m_socket;    
m_socket.connectToHost(m_host, m_port);
if (qint64 ret = m_socket.write(data, static_cast<qint64>(*n_bytes)) != -1)
{
m_socket.waitForBytesWritten(timeout);
}

如果写入了一些字节(不等于*n_bytes),m_socket.waitForBytesWritten(timeout)返回false?对于我的算法,我需要确定写入的字节数,“使用写入的字节数作为开始的偏移量(数据 + 偏移量)重试写入操作。”

最佳答案

简答:QIODevice::write() 返回的字节数是写入的字节数。用那个。

它说的任何字节都已写入,您无需再次写入它们。它们被缓冲并会尽快交付,并且没有办法将它们取回。

部分写入的唯一可能性是,如果在传输所有内容之前连接中断。在那种情况下,您没有直接 方法来查明对方实际收到了多少字节。您可以有一个协议(protocol),在意外断开连接的情况下重新连接,并询问对方接收了多少字节,但这是更高级别的逻辑,Qt 不会帮助您。

如果 QIODevice::waitForBytesWritten() 返回 false,这意味着所有内容都没有在超时内发送(到操作系统或其他),或者存在断开连接。在这种情况下,您的选择是:

  • 等待更长的时间,以防发送数据由于某种原因变慢
  • 断开连接(并可能重新连接)

注意:使用 QIODevice::waitForBytesWritten() 会导致 GUI 挂起,直到它返回,或者如文档所说:

Warning: Calling this function from the main (GUI) thread might cause your user interface to freeze.

您应该使用 QIODevice::bytesWritten() 信号来跟踪发送了多少。请注意,即使它给您的字节数少于您写入的字节数,它也只是意味着您应该很快再次收到该信号,报告写入了更多字节(或者您可能会收到断开连接信号,告诉您不会再写入任何内容)。所以你仍然不能再写任何字节。

总的来说,您应该避免将 Qt 的任何 waitForXxxx() 方法与事件循环一起使用(除非它是快速破解或一次性项目或类似的东西)。它们可能很方便,但最终会在基于事件的程序流中引起意想不到的问题。只需编写槽和连接信号,不需要很多分钟的额外工作。

关于c++ - Qt5.2 QNetwork,写了多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22549145/

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