首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QUdpSocket广播直到应答

QUdpSocket广播直到应答
EN

Stack Overflow用户
提问于 2018-02-06 10:14:07
回答 1查看 720关注 0票数 0

我正在实现一个简单的UDP服务器-客户机应用程序。主要逻辑是:服务器开始发送广播->客户端响应,->服务器停止发送广播并执行一些工作。

我被广播圈困住了:

代码语言:javascript
复制
 sUDP::sUDP(QObject *parent) : QObject(parent)
{
    serverSocket = new QUdpSocket(this);
    serverIp = new QHostAddress("192.168.1.2");

    pickUpThePhone = false;

    if(serverSocket->state() != serverSocket->BoundState){
        if (!serverSocket->bind(*serverIp, 4321)) {
            qFatal("Error binding server");
        }
    }

    connect(serverSocket,SIGNAL(readyRead()), SLOT(readSocket()));

    while(!pickUpThePhone){
        QByteArray Data;
        Data.append("server");
        serverSocket->writeDatagram(Data, Data.size(), QHostAddress("192.168.255.255"), 1234);
    }
}

实际上,信号readyRead()从未发射,因此广播从未停止:

代码语言:javascript
复制
void sUDP::readSocket()
{
    qDebug() << "read";
    while(serverSocket->hasPendingDatagrams()){
        QByteArray buffer;
        buffer.resize(serverSocket->pendingDatagramSize());

        QHostAddress sender;
        quint16 senderPort;
        serverSocket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);

        if(strcmp(buffer.data(),"stop") == 0){
            pickUpThePhone = true;
        }
    }
}

客户机的工作原理是--它使用"server“和"stop”消息来响应数据报,但是看起来while循环从来没有中断过。任何帮助都是有用的,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-06 10:21:36

它不工作,因为你的节目是忙于发送广播。您的while循环将不让Qt事件循环执行其工作,因此您的程序不能做任何其他事情。

你也在不停地发送广播,你的电脑只会做垃圾邮件。

这两个问题的解决方案都是一个定时器。创建一个重复计时器,每秒钟(或多或少)发送一次广播。收到响应时,停止或暂停计时器。

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

https://stackoverflow.com/questions/48640477

复制
相关文章

相似问题

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