什么是 QtNetwork 相当于 shutdown(..., SHUT_WR)
Posted
技术标签:
【中文标题】什么是 QtNetwork 相当于 shutdown(..., SHUT_WR)【英文标题】:What's the QtNetwork equivalent of shutdown(..., SHUT_WR) 【发布时间】:2013-10-10 12:01:37 【问题描述】:我需要使用 QtNetwork 关闭 TCP 套接字的写入端(发送 FIN)。
对于 BSD 套接字,我会调用 shutdown(..., SHUT_WR)。
如何使用 QtNetwork API 做到这一点?
【问题讨论】:
【参考方案1】:来自文档
void QIODevice::setOpenMode(QIODevice::ReadOnly)
应该帮助:
void QIODevice::setOpenMode(OpenMode openMode) [protected]
Sets the OpenMode of the device to openMode. Call this function to set the open mode if the flags change after the device has been opened.
【讨论】:
Bleh 难怪我没有看到它,考虑到这个名字并不直观,而且它位于 QIODevice 上。谢谢。 这似乎是错误的,调用后似乎什么都没有发生,并且 FIN 没有发送到另一端。阅读源代码,它看起来像 setOpenMode 只是更改了一些标志。 它使套接字只读,但我认为不发送 FIN。 SHUT_WR 不应该做同样的事情,从文档中给出它会禁用进一步写入套接字。 好的,我找到了一个附录:Implementation Notes: PF_INET::SOCK_STREAM IPPROTO_TCP::Return 0. Send queued data, wait for ACK, then send FIN.
,但这似乎真的是 BSD-socket 特定的,我稍后会看看
它不是 BSD 特定的,大多数套接字 API 都有类似的东西(winsock 中的shutdown(...,SD_SEND),java 中的 socket.shutdownOutput 等),并且它在某些协议中使用。例如,在 HTTP 中,您可以在完成发送请求时向服务器发出半关闭信号(以防由于某种原因您无法使用 content-length)以上是关于什么是 QtNetwork 相当于 shutdown(..., SHUT_WR)的主要内容,如果未能解决你的问题,请参考以下文章
Python QtNetwork.QTcpSocket.readAll() 和 QtNetwork.QTcpSocket.write() 不起作用
如何在交叉编译 Windows 的 vlc 时包含 QtNetwork