QUdpSocket广播直到回答

时间:2018-02-06 10:14:08

标签: qt network-programming udp broadcast

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

我坚持使用广播循环:

 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()从未发出,因此广播永远不会停止:

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;
        }
    }
}

客户端正常工作 - 它使用&#34; server&#34;来响应数据报。与&#34;停止&#34;消息,但看起来像while循环永远不会被中断。 任何帮助都会有用,谢谢。

1 个答案:

答案 0 :(得分:2)

它无法正常工作,因为您的程序正忙于发送广播。您的while循环不会让Qt事件循环执行其工作,因此您的程序无法执行任何其他操作。

您还会不断发送广播,您的计算机除了通过网络发送垃圾邮件之外别无其他。

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