考虑以下片段:
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 捕获的屏幕截图:
最佳答案
我对 Qt 不是很熟悉,但是在 Windows 上,没有 Fork。您正在尝试在同一线程上执行并行任务,但您应该让客户端运行在与服务器不同的线程上。
关于c++ - 为什么写入此套接字会丢弃读取缓冲区(这是真的发生了什么)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31278503/