0

システムにコマンドを送信し、システムからの応答を読み取ります。私のマシンはクライアントです。パケットをサーバーに正常に書き込みましたが、サーバーからの応答を受信できません。なぜこれが起こるのか疑問に思っています。私のコードを見てください: (サーバーアドレスは 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);
     }
}
4

1 に答える 1

2

QUdpSocket には、新しいパケットが利用可能になるたびに発行される信号 readyRead があります。イベント ループにいる場合は、それを使用することをお勧めします。

while の条件は否定されます。つまりudpsocket->pendingDatagramSize()、while ループ内で -1 が返され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);
    }
}
于 2013-10-23T14:23:34.547 に答える