我正在使用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吗?我需要确定为我的algoritm编写的字节数,“使用写入开始的字节数(数据+偏移量)重试写操作。”
发布于 2014-03-21 07:18:02
简单回答:QIODevice::write()返回的字节数是写入的字节数。用那个。
它说的任何字节都是写入的,您不需要再次写入它们。他们被缓冲,并将尽快交付,并没有办法收回他们。
只有部分写的可能性是,如果连接中断之前,所有的传输。在这种情况下,您无法直接了解对方实际接收了多少字节。您可以有一个协议,该协议在意外断开时重新连接,并询问对方接收多少字节,但这是更高级别的逻辑,Qt将无助于此。
如果QIODevice::waitForBytesWritten()返回false,这意味着在超时期间没有发送(到操作系统或其他任何东西)所有的东西,或者是断开连接。在这种情况下,您的选择是:
注意:使用QIODevice::waitForBytesWritten()会导致图形用户界面挂起,直到返回为止,或者如文档所言:
警告:从主(GUI)线程调用此函数可能会导致用户界面冻结。
您应该使用QIODevice::bytesWritten()信号来跟踪发送了多少。请注意,即使它给出的字节比您所写的要少,这也意味着您应该很快再次收到该信号,报告写入的字节数更多(或者您可能会得到断开连接的信号,说明不会再写入更多的字节)。所以你仍然不能再写任何字节。
总之,您应该避免使用Qt的任何waitForXxxx()方法和事件循环(除非是快速攻击或丢弃项目或诸如此类的东西)。它们可能很方便,但最终会在基于事件的程序流中造成意想不到的问题。只要写插槽和连接信号,就不会有多少分钟的额外工作。
https://stackoverflow.com/questions/22549145
复制相似问题