QT c++比较接收到的数据报到字符串

QT C++ compare received datagram to string

本文关键字:字符串 数据报 c++ 比较 QT      更新时间:2023-10-16

我试图将收到的数据报中的数据与字符串进行比较,当我运行程序时,我看到我收到"test",但if语句不起作用。

#include <QUdpSocket>
#include <QTextStream>
#include <string>
#include <QString>
#include <iostream>
int main()
{
    QTextStream qout(stdout);
    QUdpSocket *udpSocket = new QUdpSocket(0);
    udpSocket->bind(3838, QUdpSocket::ShareAddress);
    while (udpSocket->waitForReadyRead(-1)) {
        while(udpSocket->hasPendingDatagrams()) {
            QByteArray datagram;
            datagram.resize(udpSocket->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;
            udpSocket->readDatagram(datagram.data(), datagram.size(),
                                    &sender, &senderPort);
            qout << "received from " << sender.toString() << datagram.data() << endl;
            using namespace std;
            string jag = datagram.data();
            std::string str1 (jag.c_str());
            std::string str2 ("test.");
            printf("%s", jag.c_str());
           if (str1.compare(str2) == 0)
            {
                    printf("test ok");
            }
        }
    }
}

我试过不同的比较方法,但都没有用。

printf (" % s " jag.c_str ());当我用netcat发送测试时也显示测试什么好主意吗?谢谢:)

str2不是"test"而是"test.".

std::string str2 ("test.");

"test"不等于"test",所以比较失败。

数据报的值是多少?为什么不用QString?

const QString srt1(datagram);
// Print what did you load
qDebug() << datagram << srt1;
const QString srt2("test.");
if (QString::compare(srt1, srt2, Qt::CaseSensitive) {
    qDebug() << ("test ok");
}

最好使用异步方法,避免在while(s)内部做这样的事情。

下面的代码在一个真实的应用程序中可以正常工作。

类标题

#include <QObject>
#include <QUdpSocket>
const int     UDP_SOCKET_PORT  = 45454;
const QString UDP_HELLO_STR    = "hello!";
class YourClass: public QObject
{
    Q_OBJECT;
public:
    YourClass();
private slots:
    void processDatagram();
private:
    QUdpSocket* udpSocket;
}

类来源
YourCLass::YourClass():udpSocket(new QUdpSocket(this))
{
    udpSocket->bind(UDP_SOCKET_PORT, QUdpSocket::ShareAddress);
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processDatagram()));
}
void YourCLass::processDatagram()
{
    QByteArray l_data;
    while(udpSocket->hasPendingDatagrams())
    {
        l_data.resize(udpSocket->pendingDatagramSize());
        QHostAddress l_addr;
        udpSocket->readDatagram(l_data.data(), l_data.size(), &l_addr);
        if(UDP_HELLO_STR == l_data.data())
        {
            QString l_srv_addr = l_addr.toString();
            if(!l_srv_addr.isEmpty())
            {
                qDebug() << "Received: " << l_data.data() << "from address: " << l_addr.toString();
            }
            else
            {
                qWarning() << "Datagram != " << UDP_HELLO_STR << ": " << l_data.data();
            }
        }
    }
}