#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. То же самое с переданным портом и хостом