QUdpSocket не испускает сигнал readyRead()

Я столкнулся с проблемой QUdpSocket, Сигнал readyRead() кажется, никогда не испускается. Итак, я решил создать QTimer и проверьте состояние очереди чтения сокетов. Таким образом, я убедился, что сокет работает нормально (bytesAvailable() показывает количество байтов) и механизм сигнал / слот тоже работает (произошел сигнал timeout()). Но почему readyRead() не излучает? Благодарю.

Qt 5.1

QString EthernetListener::listen()
{
     udp_socket = new QUdpSocket(this);
     connect(udp_socket, SIGNAL(readyRead()), this, SLOT(process_messages()));
     QTimer *timer = new QTimer(this);
     connect(timer, SIGNAL(timeout()), this, SLOT(dummy_slot()));
     timer->start(1000);
     bool res = udp_socket->bind(QHostAddress::Any, 1947, QUdpSocket::ShareAddress);
     if (!res)
         return QString("Не удалось подключиться к хосту").toUtf8();
     return QString("Идет прослушка сети. Хост: ");
}

void EthernetListener::dummy_slot()
{
    int test = udp_socket->bytesAvailable();
}

void EthernetListener::process_messages()
{
     bool bp = true;
}

2 ответа

Эта проблема может возникнуть, если при обработке первой датаграммы будет доступно больше данных. Добавьте это в слот, и оно должно работать нормально:

int readCount;
while (udpSock->hasPendingDatagrams())
{
    readCount = udpSock->readDatagram(buffer, 4096);
    cout << "readCount = " << readCount << endl;
}

Вы можете попробовать реализовать базовый приемник, используя этот: Udp Receiver
Возможно, вы не правильно читаете из слота, поэтому похоже, что сигнал не излучается. Или ты звонишь bind после того, как вы подключили слот: вероятно, вам следует позвонить bind перед подключением слота.

Другие вопросы по тегам