Qt5 有没有办法让QLocalServer监听抽象的Unix套接字



是否可以使QLocalServer对象侦听Unix抽象套接字?我在qt5文档中没有看到这种可能性,只提到了命名管道:

通常你只会传入一个像"foo"这样的名称,但在Unix上,这也可以是诸如"/tmp/foo"之类的路径,而在Windows上,这可能是诸如"\.\pipe\foo"之类的管道路径

那么我应该创建自己的套接字并让对象QLocalServer听它吗?

int sockfd = ... // a lot of work
QLocalServer *srv = new QLocalServer(this);
srv->listen(static_cast<qintptr>(&sockfd)); // bad code

这听起来很奇怪,知道Qt抽象是什么以及它提供了多少可能性。

您可能已经解决了这个问题,但以防万一...

将手动设置的套接字描述符传递给QLocalServer::listen失败的事实似乎有点奇怪,所以我更仔细地研究了 Qt 源代码。 问题是使用 qintptr 作为传递的参数类型具有相当的误导性。 查看代码表明qintptr值被视为套接字描述符 - 而不是顾名思义指向套接字描述符的指针。

所以,试着改变...

srv->listen(static_cast<qintptr>(&sockfd));

自。。。

srv->listen(sockfd);

看看是否可以解决问题。

(注意:我已经编写了一些测试代码,该代码使用带有AF_UNIX + SOCK_STREAM套接字的上述修复程序,并且一切似乎都按预期工作。

我还不能发表评论,对不起。我不确定,但也许有一种方法使用 QUdpSocket,其中套接字的使用是直接的,而不是通过管道 FS。

问题是,您可以通过使用以下方法处理传入的数据报来创建服务器:

void Server::initSocket()
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::LocalHost, 7755);
    connect(udpSocket, SIGNAL(readyRead()),
            this, SLOT(readPendingDatagrams()));
}
void Server::readPendingDatagrams()
{
    while (udpSocket->hasPendingDatagrams()) {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;
        udpSocket->readDatagram(datagram.data(), datagram.size(),
                                &sender, &senderPort);
        processTheDatagram(datagram);
    }
}

然后,您可以使用 processTheDatagram(QByteArray datagram) 中的数据报信息来执行要执行的操作。

我希望它有所帮助。

相关内容

  • 没有找到相关文章

最新更新