什么是 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

QtNetwork:下载 xml 文件并读取其内容

无法使用 QtNetwork,因为应用程序使用不同的线程

Qt。如何使用 QtNetwork 查看网络上的其他计算机?

在 BB10 应用程序开发的 cpp 文件中包含 <QtNetwork> 时出错