我怎样才能清除QLocalSocket?

时间:2016-12-09 05:06:42

标签: sockets initialization qt5 qlocalsocket

我在清除 QLocalSocket 方面遇到了问题。

现在我发送&通过 QLocalServer / QLocalSocket 接收图像数据。

但是在接收程序中,由于内存中堆积的图像数据,内存会大量增加。

所以,我想在读取数据时清理套接字。

但似乎 QLocalSocket 引用中没有任何功能。

如何清除插座?

1 个答案:

答案 0 :(得分:0)

看起来避免此行为的唯一方法是关闭套接字(未命名管道服务器)并在收到足够数据后再次打开它。另请注意,只是关闭套接字并使用相同的实例(即在堆栈上创建的套接字)会给我带来很多麻烦。

我正在接下来这样做:

在发件人方面,您有:

dataSocket->write((char*)data, sizeof(data));
dataSocket->disconnectFromServer();

并在客户端:

void LocalSocketClient::requestNewFrame()
{
    if (socket) {
        socket->disconnect();
        socket->deleteLater();
    }

    socket = new QLocalSocket();
    dataStream.setDevice(socket);

    connect(socket, &QLocalSocket::disconnected, this, &LocalSocketClient::requestNewFrame);
    connect(socket, &QLocalSocket::readyRead, this, &LocalSocketClient::readSocket);

    socket->connectToServer(NAMED_PIPE_NAME, QIODevice::ReadOnly);
}

void LocalSocketClient::readSocket()
{
    if(dataStream.readRawData((char*)&currentFrame, sizeof(currentFrame)) > 0) {

    }
}

其中currentFrame是预定义数据的已知结构。

这对我来说不是最优雅的解决方案,我仍在研究如何避免无限的new / deleteLater操作。但是如果没有它们,我会在发送方那边得到随机写入错误(看起来Qt事件循环正在删除套接字句柄,一旦它被关闭而没有被删除搞乱套接字的私有数据)