2011-01-11 32 views

回答

7

一般来说,操作系统只为第一个问题提供简单的API--因为Qt是一个可移植的API,所以最好只依靠它来传输到操作系统的缓冲区。如果您需要实际的收据确认,最好由远程应用程序发送它 - 毕竟,数据可以被远程确认,但永远不会读取远程的操作系统读取缓冲区。

如果您需要避免让远程端永远阻塞您,您应该等待QIODevice::bytesWritten信号并返回到事件循环以完成其他工作,或者只需设置适当的超时时间。一般来说,远程端可能会在某种程度上阻止你 - 也就是说,它可以拒绝确认,填充本地操作系统缓冲区,此时写入操作不会使其从Qt到OS;无论waitForBytesWritten()处于什么级别,它总是可以被阻止。

因此,bytesWrittenwaitForBytesWritten()只能用于节流的数据源 - 也就是说,如果你要进入传递1G数据的插座上的紧密循环一次全部,你可能最终缓冲它在这个过程中,内存不足。通过用bytesWritten信号触发额外的读/写操作,可以避免此问题。

+0

我不需要确认收到。我真正想要的是避免客户端可以通过等待发送ACK来延迟应用程序的情况。 – 2011-01-11 05:50:05