是否可以使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)
中的数据报信息来执行要执行的操作。
我希望它有所帮助。