是否可以让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抽象是什么以及它提供了多少可能性。
发布于 2017-02-08 16:35:59
你可能已经解决了但以防万一..。
将手动设置的套接字描述符传递给QLocalServer::listen失败的事实似乎有点奇怪,因此我更仔细地查看了Qt源代码。问题是,使用qintptr作为传递的参数类型是相当误导的。查看代码显示,qintptr值被视为套接字描述符--而不是名称所暗示的指向套接字描述符的指针。
所以,试着改变..。
srv->listen(static_cast<qintptr>(&sockfd));为了..。
srv->listen(sockfd);看看能不能解决这个问题。
(注意:我已经编写了一些测试代码,这些代码使用了AF_UNIX + SOCK_STREAM套接字的上述修复程序,所有这些都像预期的那样工作。)
发布于 2017-02-07 09:45:15
我现在还不能发表评论,对不起。我不确定,但也许有一种使用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)中的数据报信息来执行您想要执行的操作。
希望能帮上忙。
https://stackoverflow.com/questions/42085259
复制相似问题