Трансляция больших данных с помощью сокетов Qt

#c #qt #sockets #udp #qudpsocket

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

Вопрос:

Я использую QT. Мне нужно передавать данные, поэтому я пытаюсь использовать QUdpSocket . Но данные могут быть слишком большими (после writeDatagram QUdpSocket::error возврата DatagramTooLargeError ). Поэтому я разделяю данные и writeDatagram несколько раз вызываю части. Но полученный сокет получает данные только один раз, только первый пакет. Полученный код

 connect(amp;m_socketReceiver, amp;QUdpSocket::readyRead, this, amp;LocalNetSharing::onDataRead);

void LocalNetSharing::onDataRead()
{
while (m_socketReceiver.hasPendingDatagrams())
{
    QByteArray datagram;
    datagram.resize(m_socketReceiver.pendingDatagramSize());

    m_socketReceiver.readDatagram(datagram.data(), datagram.size());
    //process data
}
}
  

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

1. Нет гарантии, что UDP-пакеты будут доставлены. Вам также необходимо учитывать проблемы с задержкой. Если дейтаграмма не доставляется немедленно, ваш while цикл может не увидеть ее вовремя и выйти из строя.

2. @CaptainObvlious Я понимаю, что цикл while не может его видеть, но в этом случае должен быть выдан другой сигнал readyRead, я полагаю

Ответ №1:

Из документации Qt о QUdpSocket классе :

Примечание: входящая дейтаграмма должна быть прочитана при получении сигнала readyRead(), в противном случае этот сигнал не будет отправлен для следующей дейтаграммы.

Таким образом, кажется, что вы не читаете всю дейтаграмму при каждом вызове onDataRead .

Вы не указываете хост и порт readDatagram . Я не уверен, является ли это причиной, но правильная форма :

 while (m_socketReceiver.hasPendingDatagrams())
{
     QByteArray datagram;
     datagram.resize(m_socketReceiver.pendingDatagramSize());
     m_socketReceiver.readDatagram(datagram.data(), datagram.size(), host, amp;port);
     //process data
}
  

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

1. То же самое с переданным портом и хостом