qtcpsocket :: waitforbyteswritten的行为?
-
09-10-2019 - |
题
我对行为有些困惑 QTcpSocket::waitForBytesWritten()
...
直到何时才能阻止?
- 直到将数据写入OS的内部缓冲区以通过TCP传输?
- 直到数据实际转换为TCP数据包并发送?
- 在传输整个数据并远程客户端确认已收到所有数据包之前?
我看了文档,但似乎并不十分清楚。
解决方案
一般来说,OS仅为第一个问题提供简单的API-由于QT是便携式API,因此最好依靠它来指代转移到操作系统的缓冲区。如果您需要对收据的实际确认,则最好将其发送由远程应用程序发送 - 毕竟,遥控器可以ACK可以通过遥控器进行ACK,但切勿阅读遥控器的OS读取缓冲区。
如果您需要避免将遥控侧盖住您,您应该等待 QIODevice::bytesWritten
发出信号并返回事件循环进行其他工作,或者简单地设置适当的超时。通常,远程侧总是可以在一定层面上阻止您 - 即,它可以拒绝ACK,填充您的本地操作系统缓冲区,此时写道不会从QT到OS;不管什么级别 waitForBytesWritten()
在,它总是可以阻止。
像这样, bytesWritten
和 waitForBytesWritten()
应仅用于防风数据的来源 - 即,如果您要一次紧密地将1G数据传递到套筒上,则最终可能会在此过程中对其进行缓冲并用尽内存。通过触发其他读取/写入 bytesWritten
信号,您可以避免此问题。
不隶属于 StackOverflow