首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt5有办法让QLocalServer听抽象的unix吗?

Qt5有办法让QLocalServer听抽象的unix吗?
EN

Stack Overflow用户
提问于 2017-02-07 08:44:00
回答 2查看 638关注 0票数 2

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

通常,您只需传入"foo“这样的名称,但在Unix上,这也可能是"/tmp/foo”之类的路径,而在Windows上,这可能是管道路径(如".\pipe\foo“)

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

代码语言:javascript
复制
int sockfd = ... // a lot of work
QLocalServer *srv = new QLocalServer(this);
srv->listen(static_cast<qintptr>(&sockfd)); // bad code

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

EN

回答 2

Stack Overflow用户

发布于 2017-02-08 16:35:59

你可能已经解决了但以防万一..。

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

所以,试着改变..。

代码语言:javascript
复制
srv->listen(static_cast<qintptr>(&sockfd));

为了..。

代码语言:javascript
复制
srv->listen(sockfd);

看看能不能解决这个问题。

(注意:我已经编写了一些测试代码,这些代码使用了AF_UNIX + SOCK_STREAM套接字的上述修复程序,所有这些都像预期的那样工作。)

票数 1
EN

Stack Overflow用户

发布于 2017-02-07 09:45:15

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

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

代码语言:javascript
复制
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)中的数据报信息来执行您想要执行的操作。

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42085259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档