我正在使用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;
答案 0 :(得分:2)
简答:QIODevice::write()
返回的字节数是写入的字节数。使用它。
它说的任何字节都是写的,你不需要再写一遍。它们是缓冲的,将尽快交付,并且无法取回它们。
只有部分写入的可能性是,如果在传输所有内容之前连接断开。在这种情况下,您没有直接方式来查明另一方实际接收的字节数。您可以拥有一个协议,该协议会在意外断开时重新连接,并询问另一方接收的字节数,但这是更高级别的逻辑,而Qt对此无法帮助您。
如果QIODevice::waitForBytesWritten()
返回false,则表示超时内没有发送任何内容(操作系统或其他内容),或者存在断开连接。在这种情况下,您的选择是:
注意:使用QIODevice::waitForBytesWritten()
会导致GUI挂起,直到它返回,或者正如文档所说:
警告:从主(GUI)线程调用此函数可能会导致用户界面冻结。
您应该使用QIODevice::bytesWritten()
信号来跟踪发送的数量。请注意,即使它给你的字节数比你写的少,它只是意味着你应该很快再次获得该信号,报告写入了更多的字节(或者你可能会得到断开信号,告诉你不会写更多的字节)。所以你仍然不能再写任何字节。
总的来说,你应该避免使用Qt的任何waitForXxxx()
方法和一个事件循环(除非它是一个快速的黑客或丢弃项目或类似的东西)。它们可以很方便,但最终它们会在基于事件的程序流中引起意外问题。只需写下插槽并连接信号,这不是额外工作的分钟。