Получать данные с определенного адреса с помощью QUdpSocket

#c #qt #sockets #qtnetwork #qudpsocket

#c #qt #сокеты #qtnetwork #qudpsocket

Вопрос:

Я пытаюсь установить связь между клиентами через UDP. Я использую QUdpSocket для этого.

IP-адрес моего первого клиента — 127.0.0.2, а IP-адрес второго клиента — 127.0.0.3.

В моем первом клиенте я хочу отправлять данные, поэтому я делаю это:

 socket = new QUdpSocket(this);
socket->bind(QHostAddress("127.0.0.2"), (quint16)actual_port);

...

Data = QByteArray::fromRawData((const char *)stockR.data, crypt_packet.size_struct); 
socket->writeDatagram(Data, QHostAddress("127.0.0.3"), (quint16)port_other);
  

В моем втором клиенте у меня есть это:

 socket = new QUdpSocket(this);
socket->bind(QHostAddress("127.0.0.3"), (quint16)port_second);
     
...

QByteArray buffer;
buffer.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket->readDatagram(buffer.data(), buffer.size(), amp;sender, amp;senderPort);
  

Но я не могу получать свои данные с readDatagram() , и я не знаю почему.

Я выполняю каждую функцию с обеих сторон, что означает, что я читаю и пишу на обоих клиентах (это для выполнения VoIP-вызова).

Кто-нибудь знает, в чем моя ошибка?

Комментарии:

1. Как вызывается этот последний блок? Это в ответ на readyRead сигнал? Это socket->hasPendingDatagrams() правда?

2. Я не использую socket-> hasPendingDatagrams и readyRead.

Ответ №1:

readDatagram Метод неблокирующий: вы можете использовать его только в том случае, если hasPendingDatagrams() значение true . Этот флаг, в свою очередь, регулируется выполнением цикла событий Qt.

У вас есть два варианта:

  • Используется socket->waitForReadyRead() для блокировки вашей программы на установленное время (30 секунд);
  • Или поместите приведенный выше код в обработчик слота, подключенный к readyRead сигналу, и позвольте циклу событий выполняться естественным образом, сохраняя чувствительность вашего приложения к другим входным данным.