Qt5.2 QTNetwork,写入了多少字节?

时间:2014-03-21 02:39:13

标签: c++ qt networking

我正在使用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吗? 我需要确定写入的字节数,对于我的算法, &#34;使用写入为起始偏移量的字节数(数据+偏移量)重试写入操作。&#34;

1 个答案:

答案 0 :(得分:2)

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

它说的任何字节都是写的,你不需要再写一遍。它们是缓冲的,将尽快交付,并且无法取回它们。

只有部分写入的可能性是,如果在传输所有内容之前连接断开。在这种情况下,您没有直接方式来查明另一方实际接收的字节数。您可以拥有一个协议,该协议会在意外断开时重新连接,并询问另一方接收的字节数,但这是更高级别的逻辑,而Qt对此无法帮助您。

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

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

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

  

警告:从主(GUI)线程调用此函数可能会导致用户界面冻结。

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

总的来说,你应该避免使用Qt的任何waitForXxxx()方法和一个事件循环(除非它是一个快速的黑客或丢弃项目或类似的东西)。它们可以很方便,但最终它们会在基于事件的程序流中引起意外问题。只需写下插槽并连接信号,这不是额外工作的分钟。