UDP reset
-
@Vijaykarthikeyan said in UDP reset:
reset the program if data is not received
Sorry, but this just doesn't mean very much. Don't know what you're trying to do why. You can either call
reset()
or simply discard some already-received data if that is what you want to do. You can tell if some particular time has passed since data last received via aQTimer
if you need that.readyRead() is non retunable function,what else can we do with that
Again, don't know quite how to answer.
readyRead()
is a signal. No, it does not "return" a result, that's not how signals work. Youconnect()
a slot function to the signal and that gets called each time new data is received. As said several times, in the slot you accumulate data received and act on it when you have enough bytes for whatever you want.@JonB no..u misunderstood my question..its a udpSocket->readyRead();
Here is my modified code:
#include <QCoreApplication> #include <QTextStream> #include <QtNetwork/QUdpSocket> #include <QObject> #include <QThread> #include <QtSerialPort> #include <QtSerialPort/qserialportinfo.h> #include <QSerialPortInfo> QUdpSocket *udpSocket; QTextStream output(stdout); QByteArray datagram,datagram2="10.22,27.6,30.4,0,0,12.34456678"; QHostAddress senderAddress2; quint16 senderPort2; QSerialPort *serial; QString portname; quint16 vendorId; quint16 productId; QTimer *timer; void reset_again(); void send_reply() { int bytes=udpSocket->writeDatagram(datagram2, senderAddress2, senderPort2); if(bytes) { qDebug()<<"Data is successfully sent to" << senderAddress2.toString() << ":" << senderPort2 << "-" <<datagram2; } } void process_response() { if (udpSocket->state() == QUdpSocket::BoundState) { while (udpSocket->hasPendingDatagrams()) { datagram.resize(udpSocket->pendingDatagramSize()); QHostAddress senderAddress; quint16 senderPort; int bytesRead = udpSocket->readDatagram(datagram.data(), datagram.size(), &senderAddress, &senderPort); QString data = QString::fromUtf8(datagram); qDebug() << "Received datagram from" << senderAddress.toString() << ":" << senderPort << "-" << data; if (bytesRead == -1) { qDebug() << "Failed to read datagram!"; } //udpSocket->reset(); senderAddress2 = senderAddress; senderPort2=senderPort; send_reply(); QThread::msleep(100); } } } int main() { output << "UDP Command Prompt is ready to receive data!" << "\n"; udpSocket = new QUdpSocket(); timer = new QTimer(); serial=new QSerialPort(); udpSocket->bind(QHostAddress::Any, 55000); if(QObject::connect(udpSocket, &QUdpSocket::readyRead,udpSocket, &process_response)) { //process_response(); QThread::msleep(100); } else { QObject::connect(timer,&QTimer::timeout,&reset_again); timer->setInterval(2000); } return 0; } void reset_again() { main(); }
-
@Vijaykarthikeyan Funny reply.
I know what readyRead is, but you apparently do not know what a signal is and how to use it. That's why I gave you the link. But it is up to you to learn and understand Qt basics or not, I'm out..."its a udpsocket readyRead()" - QUdpSocket is a subclass of QIODevice...
@jsulm And I know what it is and how it works.. but you don't even know the intention. If i didn't learned the basics, i couldn't came to this way. In this forum,most of the suggestions failed..i found the solutions myself . First, learn Qt basics and how to treat the help seekers..
This code never exist in any of the examples.. I have built a user interface which does not exist in any example.
-
@Vijaykarthikeyan Funny reply.
I know what readyRead is, but you apparently do not know what a signal is and how to use it. That's why I gave you the link. But it is up to you to learn and understand Qt basics or not, I'm out..."its a udpsocket readyRead()" - QUdpSocket is a subclass of QIODevice...
@jsulm Have you answered for my debug output question where i have mentioned it is printing 2 times.. firstly..dont run away with that question
-
@JonB no..u misunderstood my question..its a udpSocket->readyRead();
Here is my modified code:
#include <QCoreApplication> #include <QTextStream> #include <QtNetwork/QUdpSocket> #include <QObject> #include <QThread> #include <QtSerialPort> #include <QtSerialPort/qserialportinfo.h> #include <QSerialPortInfo> QUdpSocket *udpSocket; QTextStream output(stdout); QByteArray datagram,datagram2="10.22,27.6,30.4,0,0,12.34456678"; QHostAddress senderAddress2; quint16 senderPort2; QSerialPort *serial; QString portname; quint16 vendorId; quint16 productId; QTimer *timer; void reset_again(); void send_reply() { int bytes=udpSocket->writeDatagram(datagram2, senderAddress2, senderPort2); if(bytes) { qDebug()<<"Data is successfully sent to" << senderAddress2.toString() << ":" << senderPort2 << "-" <<datagram2; } } void process_response() { if (udpSocket->state() == QUdpSocket::BoundState) { while (udpSocket->hasPendingDatagrams()) { datagram.resize(udpSocket->pendingDatagramSize()); QHostAddress senderAddress; quint16 senderPort; int bytesRead = udpSocket->readDatagram(datagram.data(), datagram.size(), &senderAddress, &senderPort); QString data = QString::fromUtf8(datagram); qDebug() << "Received datagram from" << senderAddress.toString() << ":" << senderPort << "-" << data; if (bytesRead == -1) { qDebug() << "Failed to read datagram!"; } //udpSocket->reset(); senderAddress2 = senderAddress; senderPort2=senderPort; send_reply(); QThread::msleep(100); } } } int main() { output << "UDP Command Prompt is ready to receive data!" << "\n"; udpSocket = new QUdpSocket(); timer = new QTimer(); serial=new QSerialPort(); udpSocket->bind(QHostAddress::Any, 55000); if(QObject::connect(udpSocket, &QUdpSocket::readyRead,udpSocket, &process_response)) { //process_response(); QThread::msleep(100); } else { QObject::connect(timer,&QTimer::timeout,&reset_again); timer->setInterval(2000); } return 0; } void reset_again() { main(); }
@Vijaykarthikeyan said in UDP reset:
void reset_again()
{
main();
}Why are you calling main() here?! Never saw such thing. Don't do that!
In main you connect a slot to readyRead. That means: after each reset you will have one more connection and your slot will be called more than once. You also instantiate udp socket, timer and serial port there every time you call main(), so you also have a memory leak.
Also, remove the QThread::msleep(100); as already explained and start Qt event loop in main instead (like in almost every Qt application)! The code you posted is really strange, sorry for writing this, but you should really fix it.What do you actually want to "reset" and why?
-
@Vijaykarthikeyan said in UDP reset:
void reset_again()
{
main();
}Why are you calling main() here?! Never saw such thing. Don't do that!
In main you connect a slot to readyRead. That means: after each reset you will have one more connection and your slot will be called more than once. You also instantiate udp socket, timer and serial port there every time you call main(), so you also have a memory leak.
Also, remove the QThread::msleep(100); as already explained and start Qt event loop in main instead (like in almost every Qt application)! The code you posted is really strange, sorry for writing this, but you should really fix it.What do you actually want to "reset" and why?
@jsulm Acutally,this code is a part of receiver,another part is the sender which sends the data asynchronously..we don't get the data ,indeed the correct data all the time. If there is no data or any data get corrupted during transmission, this receiver should reset means it should enter/restarts the main loop again which is an alternative to app.exec(). Delay is not a big problem.So, ignore any event loop delays which are all caused by msleep and all.
this is the requirement which I'm trying to figure out. For sometimes it works.
So,instead of the event loop app.exec(), i want to do some condition to run that event loop
-
@jsulm Acutally,this code is a part of receiver,another part is the sender which sends the data asynchronously..we don't get the data ,indeed the correct data all the time. If there is no data or any data get corrupted during transmission, this receiver should reset means it should enter/restarts the main loop again which is an alternative to app.exec(). Delay is not a big problem.So, ignore any event loop delays which are all caused by msleep and all.
this is the requirement which I'm trying to figure out. For sometimes it works.
So,instead of the event loop app.exec(), i want to do some condition to run that event loop
@Vijaykarthikeyan
You have decided that you know how to write the Qt program your way, and don't seem to like the advice you are getting here. Best of luck.In this forum,most of the suggestions failed..i found the solutions myself .
Then you have discovered that the suggestions here are worthless and you would be best sticking to finding the solutions for yourself. Nobody wants to suggest stuff to be told it's not appreciated.
FWIW, calling
main()
again won't work right. -
@Vijaykarthikeyan
You have decided that you know how to write the Qt program your way, and don't seem to like the advice you are getting here. Best of luck.In this forum,most of the suggestions failed..i found the solutions myself .
Then you have discovered that the suggestions here are worthless and you would be best sticking to finding the solutions for yourself. Nobody wants to suggest stuff to be told it's not appreciated.
FWIW, calling
main()
again won't work right.@JonB For sometimes calling main() works successfully.Whenever I raised the topic you guys never take that question and giving feedbacks about someother topics which is irrelevant to the topic. Even in this question, my question is to reset the udp whenevr there is no data is coming.But, you are accusing me about the code. If that was my problem,why shouldn't i raised that topic? because that's not the problem which im seeking to? still you guys ain't directly answering the question. If you know the answer,please tell that afterwards you can accuse me
-
@JonB For sometimes calling main() works successfully.Whenever I raised the topic you guys never take that question and giving feedbacks about someother topics which is irrelevant to the topic. Even in this question, my question is to reset the udp whenevr there is no data is coming.But, you are accusing me about the code. If that was my problem,why shouldn't i raised that topic? because that's not the problem which im seeking to? still you guys ain't directly answering the question. If you know the answer,please tell that afterwards you can accuse me
@Vijaykarthikeyan
Nobody has "accused" you of anything, or been impolite. Merely trying to help.I have already asked a couple of times what you mean by "reset the UDP", maybe if you answered that it would help. If you want to discard any data already received then do so. If you want to close the socket and re-open it then do so. If you want to destroy the UDP socket object and create a new one afresh then do so. No call to
main()
a second time. -
@JonB For sometimes calling main() works successfully.Whenever I raised the topic you guys never take that question and giving feedbacks about someother topics which is irrelevant to the topic. Even in this question, my question is to reset the udp whenevr there is no data is coming.But, you are accusing me about the code. If that was my problem,why shouldn't i raised that topic? because that's not the problem which im seeking to? still you guys ain't directly answering the question. If you know the answer,please tell that afterwards you can accuse me
There is no thing like a 'reset' for an udp connection. If you want a timeout use a QTimer as already told you. Everything else was already told - don't block the qt's event loop but use proper signals and slots. Or use another framework which does not need a running event loop (if you did one).
-
@Vijaykarthikeyan
Nobody has "accused" you of anything, or been impolite. Merely trying to help.I have already asked a couple of times what you mean by "reset the UDP", maybe if you answered that it would help. If you want to discard any data already received then do so. If you want to close the socket and re-open it then do so. If you want to destroy the UDP socket object and create a new one afresh then do so. No call to
main()
a second time.@JonB As I already told @jsulm again explaining my issue. resetting the udp means instead of auto calling the event loop by app.exec(), there should be some condition to enter /restart the event loop. no worry about the delays.
Acutally,this code is a part of receiver,another part is the sender which sends the data asynchronously..we don't get the data ,indeed the correct data all the time. If there is no data or any data get corrupted during transmission, this receiver should reset means it should enter/restarts the main loop again which is an alternative to app.exec(). Delay is not a big problem.So, ignore any event loop delays which are all caused by msleep and all.
this is the requirement which I'm trying to figure out. For sometimes it works.
So,instead of the event loop app.exec(), i want to do some condition to run that event loop
-
@JonB As I already told @jsulm again explaining my issue. resetting the udp means instead of auto calling the event loop by app.exec(), there should be some condition to enter /restart the event loop. no worry about the delays.
Acutally,this code is a part of receiver,another part is the sender which sends the data asynchronously..we don't get the data ,indeed the correct data all the time. If there is no data or any data get corrupted during transmission, this receiver should reset means it should enter/restarts the main loop again which is an alternative to app.exec(). Delay is not a big problem.So, ignore any event loop delays which are all caused by msleep and all.
this is the requirement which I'm trying to figure out. For sometimes it works.
So,instead of the event loop app.exec(), i want to do some condition to run that event loop
There is no need for restarting the main event loop. It will not automagically re-sync something.
Also udp is stateless. If you want more you have to create your own protocol on top of udp or even better tcp. -
There is no thing like a 'reset' for an udp connection. If you want a timeout use a QTimer as already told you. Everything else was already told - don't block the qt's event loop but use proper signals and slots. Or use another framework which does not need a running event loop (if you did one).
@Christian-Ehrlicher Yes, but my requirement is to restart the main eventloop whenever there is no incoming data from sender side. I also added modified the code and already posted instead of former one where I have used timer and proper signal slot connection. Can I again send it to you,sir
-
There is no need for restarting the main event loop. It will not automagically re-sync something.
Also udp is stateless. If you want more you have to create your own protocol on top of udp or even better tcp.@Christian-Ehrlicher yes..it is because of app.exec() at the end.Am i right? sir
-
@Christian-Ehrlicher Yes, but my requirement is to restart the main eventloop whenever there is no incoming data from sender side. I also added modified the code and already posted instead of former one where I have used timer and proper signal slot connection. Can I again send it to you,sir
@Vijaykarthikeyan said in UDP reset:
but my requirement is to restart the main eventloop whenever there is no incoming data from sender side
This is stupid, wrong and absolutely not needed and has nothing to do with a 'udp reset'.
Bye
-
@Vijaykarthikeyan said in UDP reset:
but my requirement is to restart the main eventloop whenever there is no incoming data from sender side
This is stupid, wrong and absolutely not needed and has nothing to do with a 'udp reset'.
Bye
@Christian-Ehrlicher then,how to restart the udp like watchdog timer
-
@Christian-Ehrlicher @JonB @jsulm Now,it is working..
#include <QCoreApplication> #include <QTextStream> #include <QtNetwork/QUdpSocket> #include <QObject> #include <QThread> #include <QtSerialPort> #include <QtSerialPort/qserialportinfo.h> #include <QSerialPortInfo> QUdpSocket *udpSocket; QTextStream output(stdout); qreal x ; qreal y ; qreal z ; QString x2,y2,z2; QByteArray datagram,datagram2; QHostAddress senderAddress2; quint16 senderPort2; QTimer *timer; bool state; static bool state2=true; void reset_again(); void send_reply() { datagram2.clear(); x = static_cast<qreal>(rand()) / RAND_MAX; y = static_cast<qreal>(rand()) / RAND_MAX; z = static_cast<qreal>(rand()) / RAND_MAX; x2 = QString::number(x); y2 = QString::number(y); z2 = QString::number(z); datagram2.append(x2); datagram2.append(","); datagram2.append(y2); datagram2.append(","); datagram2.append(z2); datagram2.append(","); int bytes=udpSocket->writeDatagram(datagram2, senderAddress2, senderPort2); if(bytes) { qDebug()<<"Data is successfully sent to" << senderAddress2.toString() << ":" << senderPort2 << "-" <<datagram2; } } void process_response() { if (udpSocket->state() == QUdpSocket::BoundState) { while (udpSocket->hasPendingDatagrams()) { datagram.resize(udpSocket->pendingDatagramSize()); QHostAddress senderAddress; quint16 senderPort; int bytesRead = udpSocket->readDatagram(datagram.data(), datagram.size(), &senderAddress, &senderPort); QString data = QString::fromUtf8(datagram); qDebug() << "Received datagram from" << senderAddress.toString() << ":" << senderPort << "-" << data; if (bytesRead == -1) { qDebug() << "Failed to read datagram!"; } senderAddress2 = senderAddress; senderPort2=senderPort; send_reply(); } } } void event_loop(); void reset_again() { qDebug()<<"No data is detected"; udpSocket->close(); event_loop(); } void event_loop() { output << "UDP Command Prompt is ready to receive data!" << "\n"; udpSocket = new QUdpSocket(); timer = new QTimer(); udpSocket->bind(QHostAddress::Any, 10050); state=QObject::connect(udpSocket, &QUdpSocket::readyRead,udpSocket, &process_response); while(state) { process_response(); if(udpSocket->waitForReadyRead(500)); else { state=false; reset_again(); } } } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); event_loop(); return 0; }
-