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 回答