Russian Qt Forum
Ноябрь 22, 2024, 20:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QUdpSocket && broadcast  (Прочитано 4534 раз)
xk
Гость
« : Май 27, 2006, 13:34 »

Есть задача: заслать пакет броадкастом и получить ответы на тот же порт, с которого посылали.
Тестовая программа:

Код:
#include <iostream>

#include <QUdpSocket>
#include <QHostAddress>
#include <QFile>
#include <QByteArray>
#include <QCoreApplication>
#include <QTextStream>

int main(int argc, char **argv)
{
  if(argc != 2)
  {
    std::cerr << "usage: " << argv[0] << " <ip>\n";
    return 1;
  }
  QCoreApplication app(argc, argv);

  QFile log("net_test.log");
  QTextStream logIO(&log);
  log.open(QIODevice::WriteOnly);
  logIO << "------------ Net Test ------------\n";

  QHostAddress remoteHost(argv[1]);
  QUdpSocket udpSocket;
  udpSocket.bind(31317);

  QByteArray toSend("\xFF\xFF\xFF\xFFinfostring\x00");
  udpSocket.writeDatagram(toSend.data(), toSend.size(), remoteHost, 27015);

  QByteArray toRecv;

  while(udpSocket.waitForReadyRead(2000))
  {
    logIO << "\n\nReadyRead() == true\n\n";

    while(udpSocket.hasPendingDatagrams())
    {
      logIO << "\n\nhasPendingDatagrams() == true\n\n";

      toRecv.resize(udpSocket.pendingDatagramSize());
      udpSocket.readDatagram(toRecv.data(), toRecv.size());

      logIO << "toRecv: "<< toRecv;
    }
    logIO << "\n\nafter while2\n\n";
  }
  log.close();
  return 0;
}


допустим в сети есть 1 машина, которая должна отвлекатся.
если ип задать как первые.три.октета.255 то результат такой:

Код:
------------ Net Test ------------

ReadyRead() == true

hasPendingDatagrams() == true

toRecv: <полученные байты>

hasPendingDatagrams() == true

toRecv: <_опять_ полученные байты>

after while2


а если же ип задать как 255.255.255.255, то получаем ожидаемый результат:
Код:

------------ Net Test ------------

ReadyRead() == true

hasPendingDatagrams() == true

toRecv: <полученные байты>  

after while2


Почему hasPendingDatagrams() в первом случае отрабатывает 2 раза ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.041 секунд. Запросов: 20.