Я отправляю себе UDP-пакеты, как правило, используя этот метод здесь:
Как получить правильный пакет UDP в QT?
Я настраиваю режимы так, чтобы в режиме записи он отправлял UDP-пакеты каждую секунду, а в режиме чтения он просто принимал пакеты. Для этого я установил простую логическую переменную с именем readmode
, когда readmode = true
, она читает и пишет, когда = false
. Я оставил connect(socket, SIGNAL(readyRead()), this,SLOT(readyRead()));
и вызов функции send в конструкторе MainWindow
и поместил операторы if
, проверяя состояние readMode
для фактического выполнения чего-либо, в функции send и самих readyRead()
.
Моя проблема в том, что я получаю пакеты только тогда, когда запускаю программу в режиме чтения, прежде чем открыть окно для записи программы. Если я начну отправлять пакеты до того, как открою программу чтения, я ничего не получу.
Для пояснения я открываю два экземпляра этой программы и устанавливаю один для чтения, а другой для записи, но сначала нужно запустить чтение, чтобы оно заработало, но как только состояния меняются, он перестает работать.
Как я могу заставить его читать все время?
Пример кода:
bool readMode = true; //Write mode = false, Read Mode = true
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer = new QTimer(this);
timer->start(1000);
ui->buttonBox->button(QDialogButtonBox::Ok)->setText("Read");
ui->buttonBox->button(QDialogButtonBox::Cancel)->setText("Write");
out_socket = new QUdpSocket(this);
out_socket->bind(60500);
in_socket = new QUdpSocket(this);
in_socket->bind(60510);
connect(timer, SIGNAL(timeout()),this,SLOT(UDP_test()));
connect(in_socket,SIGNAL(readyRead()),this,SLOT(readyRead()));
}
void MainWindow::UDP_test() //Write Mode
{
if (readMode == false) //Write Mode
{
QByteArray Data;
Data.append(fullResultString);
out_socket->writeDatagram(Data,QHostAddress("192.168.127.10"),60510);
}
void MainWindow::readyRead() //Read Mode
{
if (readMode == true) //Readmode
{
while(in_socket->hasPendingDatagrams())
{
QByteArray UDPBuffer;
UDPBuffer.resize(in_socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
in_socket->readDatagram(UDPBuffer.data(),UDPBuffer.size(), &sender, &senderPort);
}