не может читать из клиента QUdpSocket

Я отправляю команду в систему и читаю от нее ответ. Моя машина клиентская, я успешно пишу пакет на сервер, но не могу получить от него ответ. Мне интересно, почему это происходит, посмотрите мой код: (адрес сервера 192.168.100.143 и порт 11000)

void UDP::UDPInit(int port)
{
    socketPort = port;

    udpsocket = new QUdpSocket(this);
}


void UDP::sendCommand(QByteArray data)
{
    QHostAddress *host  = new QHostAddress("192.168.100.143");
    quint16 port = 11000;
    if(udpsocket->writeDatagram(data.data(),QHostAddress(ip),socketPort)==-1)
        emit clientLogMessage(QString("UDPCLIENT : Write problem !"));
    else
        udpsocket->flush();

    while (!udpsocket->hasPendingDatagrams()) {
         QByteArray datagram;
         datagram.resize(udpsocket->pendingDatagramSize());
         qDebug() << udpsocket->pendingDatagramSize();
         udpsocket->readDatagram(datagram.data(), datagram.size(), host, &port);
         emit dataReceived(datagram);
     }
}

person Sam    schedule 23.10.2013    source источник
comment
если вы находитесь в цикле событий, просто подключитесь к сигналу readyRead() udpsocket вместо этого цикла while   -  person ratchet freak    schedule 23.10.2013
comment
Могу я спросить разницу?   -  person Sam    schedule 23.10.2013
comment
возвращаясь к четному циклу и не занимаясь ошибками, которые я вижу в цикле   -  person ratchet freak    schedule 23.10.2013
comment
У вас там утечка памяти. QHostAddress *host = new QHostAddress("192.168.100.143");. Там нет причин использовать указатель. Вы должны создать его следующим образом: QHostAddress host("192.168.100.143");   -  person thuga    schedule 24.10.2013
comment
Я протестировал программу, bind все еще возвращает false!, интересно, почему это происходит!   -  person Sam    schedule 26.10.2013
comment
Я думаю, вам придется вызвать bind() и привязать свой объект QUdpSocket к адресу, если вы хотите прослушивать дейтаграммы. bind() возвращает true, если он был успешно связан, не забудьте проверить это.   -  person thuga    schedule 30.10.2013


Ответы (1)


QUdpSocket имеет сигнал readyRead, который испускается каждый раз, когда доступен новый пакет, если вы находитесь в цикле событий, я предлагаю вам его использовать.

условие в вашем while отрицается, что означает, что udpsocket->pendingDatagramSize() вернет -1 внутри цикла while, а readDatagram отбросит пакет

фиксированный код:

void UDP::UDPInit(int port)
{
    socketPort = port;

    udpsocket = new QUdpSocket(this);
    connect(udpsocket, SIGNAL(readyRead()), this, SLOT(readSocket()));
}


void UDP::sendCommand(QByteArray data)
{
    QHostAddress *host  = new QHostAddress("192.168.100.143");
    quint16 port = 11000;
    if(udpsocket->writeDatagram(data.data(),QHostAddress(ip),socketPort)==-1)
        emit clientLogMessage(QString("UDPCLIENT : Write problem !"));
    else
        udpsocket->flush();

}

void UDP::readSocket()
{
    while (udpsocket->hasPendingDatagrams())
    {
         QByteArray datagram;
         datagram.resize(udpsocket->pendingDatagramSize());
         qDebug() << udpsocket->pendingDatagramSize();
         udpsocket->readDatagram(datagram.data(), datagram.size(), host, &port);
         emit dataReceived(datagram);
    }
}
person ratchet freak    schedule 23.10.2013
comment
Спасибо за исправление. Однако я до сих пор не понимаю разницы между использованием сигнала и простым циклом while. оба делают то же самое, по-видимому, здесь. - person Sam; 23.10.2013
comment
нет, цикл while на самом деле никогда не ждет, пока что-то не сможет прочитать, если вы не сделаете waitForReadyRead, но тогда вы блокируете поток событий, и с ним больше ничего нельзя сделать - person ratchet freak; 23.10.2013
comment
нужно ли вызывать bind() в этой программе? парень предположил, что это может быть связано с игнорированием bind(), и если я это сделаю, я не смогу читать с сервера, хотя я могу успешно писать на него. - person Sam; 24.10.2013
comment
Я протестировал программу, bind все еще возвращает false!, интересно, почему это происходит! - person Sam; 26.10.2013