c++ - 为什么写入此套接字会丢弃读取缓冲区(这是真的发生了什么)?

标签 c++ windows qt sockets

考虑以下片段:

QTcpServer server;
server.listen(QHostAddress::LocalHost);

QTcpSocket clientSocket;
clientSocket.connectToHost(server.serverAddress(), server.serverPort());

// ...wait for connection to succeed...

QTcpSocket *serverSocket = server.nextPendingConnection();
serverSocket->write("test");
serverSocket->close();

此代码段的目标是通过创建一个 QTcpServer 监听传入连接并使用另一个 QTcpSocket 连接到它来创建两个连接的套接字。建立连接后,数据将写入其中一个套接字并关闭。

QAbstractSocket::close() invokes disconnectFromHost() documentation for QAbstractSocket::disconnectFromHost()明确指出:

If there is pending data waiting to be written, QAbstractSocket will enter ClosingState and wait until all data has been written.

下一个片段短暂地进入事件循环以处理未决事件,然后尝试从另一个套接字读取字符串:

QCoreApplication::processEvents();
qDebug() << clientSocket.readAll();

这会打印 "test" 并且一切正常。也许不是。如果我通过预先调用 write() 来修改前面的代码片段,则无法再从套接字读取数据:

clientSocket.write("test");
QCoreApplication::processEvents();
qDebug() << clientSocket.readAll();

这将打印一个空字符串 ("") 而不是上一次运行的预期值。为什么这次socket读不到值?

注意:这在 Windows 平台上表现出来。 Qt 的 Linux 和 Mac OS X 构建都没有表现出这种行为,而是在两种情况下都打印了预期值。

第二个注意事项:如果您想玩一下代码,这里有一个可用的 Gist:https://gist.github.com/nathan-osman/ee6116d120903db84384

第三个注意事项:这是 TCP 交换的 Wireshark 捕获的屏幕截图:

enter image description here

最佳答案

我对 Qt 不是很熟悉,但是在 Windows 上,没有 Fork。您正在尝试在同一线程上执行并行任务,但您应该让客户端运行在与服务器不同的线程上。

关于c++ - 为什么写入此套接字会丢弃读取缓冲区(这是真的发生了什么)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31278503/

相关文章:

linux - 发送大量UDP数据包时如何减少系统调用开销? (Windows 和 Linux)

.net - 如何从客户端桌面应用程序记录和检索错误消息?

c++ - 将 qnetworkaccessmanager 连接到插槽

c++ - 无法将 Qt 链接到 Xcode

在 QVector 中使用指针和非指针参数的 C++ 模板

具有相同名称的 C++ 变量,上下文 : global and private,

java - Dockererized Kong 在 Windows 上给出 "An invalid response was received from the upstream server"

c++ - 将 Qt 基类信号映射到派生类中的槽

c++ - 我可以通过递增指针来移动数组吗? Qt

c++ - c++修改basic_ostream对象的内容,或者,删除basic_ostream对象的数据内容