我对QTcpSocket::waitForBytesWritten()
的行为有点困惑...QTcpSocket :: waitForBytesWritten的行为?
直到什么时候该功能被阻止?
- 直到数据写入OS的内部缓冲区以通过TCP传输?
- 直到数据被物理转换为TCP数据包并发送出去?
- 在传输整个数据并且远程客户端确认已收到所有数据包之前?
我看了看文档,但看起来似乎不太清楚。
我对QTcpSocket::waitForBytesWritten()
的行为有点困惑...QTcpSocket :: waitForBytesWritten的行为?
直到什么时候该功能被阻止?
我看了看文档,但看起来似乎不太清楚。
一般来说,操作系统只为第一个问题提供简单的API--因为Qt是一个可移植的API,所以最好只依靠它来传输到操作系统的缓冲区。如果您需要实际的收据确认,最好由远程应用程序发送它 - 毕竟,数据可以被远程确认,但永远不会读取远程的操作系统读取缓冲区。
如果您需要避免让远程端永远阻塞您,您应该等待QIODevice::bytesWritten
信号并返回到事件循环以完成其他工作,或者只需设置适当的超时时间。一般来说,远程端可能会在某种程度上阻止你 - 也就是说,它可以拒绝确认,填充本地操作系统缓冲区,此时写入操作不会使其从Qt到OS;无论waitForBytesWritten()
处于什么级别,它总是可以被阻止。
因此,bytesWritten
和waitForBytesWritten()
只能用于节流的数据源 - 也就是说,如果你要进入传递1G数据的插座上的紧密循环一次全部,你可能最终缓冲它在这个过程中,内存不足。通过用bytesWritten
信号触发额外的读/写操作,可以避免此问题。
我不需要确认收到。我真正想要的是避免客户端可以通过等待发送ACK来延迟应用程序的情况。 – 2011-01-11 05:50:05