QT C ++ сравнивает полученную дейтаграмму со строкой

Я пытаюсь сравнить данные в полученной дейтаграмме со строкой, когда я запускаю программу, я вижу, что я получаю «тест», но оператор 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
есть идеи?
Спасибо 🙂

-1

Решение

str2 это не «тест», а «тест».

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

«тест» не равен «тест». так что сравнение не удается.

1

Другие решения

Какое значение имеет датаграмма? Почему вы не используете 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");
}
0

Лучше использовать асинхронный подход, избегайте делать такие вещи внутри 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();
}
}
}
}
0