QUdpSocket 广播直到被应答
QUdpSocket broadcast till answered
我正在实现一个简单的 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;
}
}
}
客户端正常工作 - 它使用 "server" 和 "stop" 消息响应数据报,但看起来 while 循环从未中断。
任何帮助都会有用,谢谢。
它不起作用,因为您的程序正忙于发送广播。您的 while
循环不会让 Qt 事件循环执行它的工作,因此您的程序不能做任何其他事情。
您还在不断发送广播,您的计算机只会向网络发送垃圾邮件。
这两个问题的解决方案是计时器。创建一个重复计时器,每秒(或多或少)发送一次广播。收到回复后停止或暂停计时器。
我正在实现一个简单的 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;
}
}
}
客户端正常工作 - 它使用 "server" 和 "stop" 消息响应数据报,但看起来 while 循环从未中断。 任何帮助都会有用,谢谢。
它不起作用,因为您的程序正忙于发送广播。您的 while
循环不会让 Qt 事件循环执行它的工作,因此您的程序不能做任何其他事情。
您还在不断发送广播,您的计算机只会向网络发送垃圾邮件。
这两个问题的解决方案是计时器。创建一个重复计时器,每秒(或多或少)发送一次广播。收到回复后停止或暂停计时器。