【问题标题】:QT C++ compare received datagram to stringQT C++ 将接收到的数据报与字符串进行比较
【发布时间】:2016-09-03 19:42:40
【问题描述】:

我试图将接收到的数据报中的数据与字符串进行比较,当我运行程序时,我看到我收到“测试”,但 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 发送测试时也显示测试 有任何想法吗? 谢谢:)

【问题讨论】:

  • 数据报的值在您的调试器中显示为什么?

标签: c++ string qt compare datagram


【解决方案1】:

str2 不是“测试”而是“测试”。

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

“测试”不等于“测试”。所以比较失败。

【讨论】:

    【解决方案2】:

    数据报的价值是什么?为什么不使用 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");
    }
    

    【讨论】:

      【解决方案3】:

      最好使用异步方法,避免在 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();
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-01
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多