QUdpSocket : simple communication between 2 Qt applications
-
Hi,
I have 2 application one (qt console app) sends data over UDP every 3 seconds,
and the 2nd (qt widget app) has to recive the data every 3seconds.My probleme is the 2nd app recives data only once. If i restart it, it will recive once again and then nothing.
What is my misstake please ?
app 1 (sender):
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTimer t; t.setInterval(3000); QObject::connect(&t,&QTimer::timeout,[](){ qDebug()<<"trig"; QUdpSocket sk; QByteArray d; QString _cmd("TRIG"); d.append(_cmd); sk.writeDatagram(d, QHostAddress("127.0.0.1"),65222); }); t.start(); return a.exec(); }
app 2 (reciver):
int main(int argc, char *argv[]) { QApplication a(argc, argv); QUdpSocket sk; QObject::connect(&sk,&QUdpSocket::readyRead,[](){ qDebug()<< "read"; // this happends only once }); sk.bind(QHostAddress::Any,65222); MainWindow w; w.show(); return a.exec(); }
-
Just a guess but, you are not reading the data when it comes in, so it is still ready to be read. New data comes in but you haven't done any reading from the old data that was there before so it doesn't re-emit the signal.
Try doing a readAll() in your lambda and see if that fixes it.
-
Just a guess but, you are not reading the data when it comes in, so it is still ready to be read. New data comes in but you haven't done any reading from the old data that was there before so it doesn't re-emit the signal.
Try doing a readAll() in your lambda and see if that fixes it.
@MrShawn
Thank you for the answerint main(int argc, char *argv[]) { QApplication a(argc, argv); QUdpSocket sk; QObject::connect(&sk,&QUdpSocket::readyRead,&sk,[&](){ // sk.open(QUdpSocket::ReadOnly); qDebug()<< "read : "<< sk.readAll(); // this happends only once }); sk.bind(QHostAddress::Any,65222); MainWindow w; w.show(); return a.exec(); }
i tryed this, but no data is read , this is tha output :
QIODevice::read (QUdpSocket): device not open read :
I tryed to calling sk.open(QUdpSocket::ReadOnly);
with this no more "device not open" message, but still no data and called only once. -
I also tryed to move the QUDPSocket in my MainWindow widget class.
i haveprivate : QUdpSocket *sk;
ctor :
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); sk = new QUdpSocket(this); sk->bind(QHostAddress::Any,65222); QObject::connect(sk,&QUdpSocket::readyRead,this,&MainWindow::skReady); }
and the slot :
void skReady(){ sk->open(QUdpSocket::ReadOnly); qDebug()<<"read :" << sk->readAll(); }
-
You need to read the datagram. Try the following in server
int main(int argc, char *argv[]) { QApplication a(argc, argv); QUdpSocket sk; sk.bind(QHostAddress::Any,65222); QObject::connect(&sk,&QUdpSocket::readyRead,[&sk](){ qDebug() << Q_FUNC_INFO << endl; sk.receiveDatagram(); }); return a.exec(); }
-
I also tryed to move the QUDPSocket in my MainWindow widget class.
i haveprivate : QUdpSocket *sk;
ctor :
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); sk = new QUdpSocket(this); sk->bind(QHostAddress::Any,65222); QObject::connect(sk,&QUdpSocket::readyRead,this,&MainWindow::skReady); }
and the slot :
void skReady(){ sk->open(QUdpSocket::ReadOnly); qDebug()<<"read :" << sk->readAll(); }
@LeLev
I was just about to suggest as per @dheerendra --- you need to read the datagram properly.
I think the trouble with tryingreadAll()
etc. might be:The most common way to use this class is to bind to an address and port using bind(), then call writeDatagram() and readDatagram() / receiveDatagram() to transfer data. If you want to use the standard QIODevice functions read(), readLine(), write(), etc., you must first connect the socket directly to a peer by calling connectToHost().
-
You need to read the datagram. Try the following in server
int main(int argc, char *argv[]) { QApplication a(argc, argv); QUdpSocket sk; sk.bind(QHostAddress::Any,65222); QObject::connect(&sk,&QUdpSocket::readyRead,[&sk](){ qDebug() << Q_FUNC_INFO << endl; sk.receiveDatagram(); }); return a.exec(); }
hi @dheerendra ,
I don't understand,
i my server i have nothing to read, i only want to write. The reciver (2nd app) has to read (sk.receiveDatagram() ). am i missing something or you misunderstood my question ..? -
Did you try the way I suggested ? Did that work ?
-
hi @dheerendra ,
I don't understand,
i my server i have nothing to read, i only want to write. The reciver (2nd app) has to read (sk.receiveDatagram() ). am i missing something or you misunderstood my question ..?@LeLev
@dheerendra's code is the code to put into your client.
OIC, he wrote "server" --- it must have been a slip, he meant "client" :) -
That worked thank you very much
void skReady(){ QByteArray buffer; buffer.resize(static_cast<int>(sk->pendingDatagramSize())); QHostAddress sender("127.0.0.1"); quint16 senderPort=65111; qDebug()<<sk->readDatagram(buffer.data(), buffer.size(),&sender, &senderPort); }
-
Some confusion with where to place my code. Code has to be placed in App2(receiver) & not in the sender(App1)
- Client is writing data. So what you have in sender is fine.
- Receiver - You should place the code I suggested.
Then tell me.
-
Some confusion with where to place my code. Code has to be placed in App2(receiver) & not in the sender(App1)
- Client is writing data. So what you have in sender is fine.
- Receiver - You should place the code I suggested.
Then tell me.
@dheerendra
I'm only used to TCP. Never thought about terminology for UDP! I would have called the [UDP] server the side which is writing, not client, but maybe you know better than I :)
https://stackoverflow.com/questions/9951875/who-is-the-server-and-who-is-the-client-in-udp -
OK. Client & Server is only terminology.
- Server is the one which is waiting for connection.
- Client is the one which is initiating the connection.
Once connection is established client/server terminology w.r.t data transfer is blurred as both will start transferring the data.
-
You need to read the datagram. Try the following in server
int main(int argc, char *argv[]) { QApplication a(argc, argv); QUdpSocket sk; sk.bind(QHostAddress::Any,65222); QObject::connect(&sk,&QUdpSocket::readyRead,[&sk](){ qDebug() << Q_FUNC_INFO << endl; sk.receiveDatagram(); }); return a.exec(); }
@dheerendra i am using QT widget application to receive udp packets from another PC. my udp source is a labview VI. i am able to receive the data which i am sending .it is displaying in the debug window but not displaying in the user interface window.i tried textedit and listwidget. but not displaying anything. this is my first QT pgm. plz help.
-
@dheerendra i am using QT widget application to receive udp packets from another PC. my udp source is a labview VI. i am able to receive the data which i am sending .it is displaying in the debug window but not displaying in the user interface window.i tried textedit and listwidget. but not displaying anything. this is my first QT pgm. plz help.
-
@reshu
Raise a new topic for this (and you will need to show some code beyond what you have asked here before anyone can help you). It has nothing to do with thisQUdpSocket
issue. -
@reshu
So when you go to https://forum.qt.io/category/10/general-and-desktop you do not see a big blue New Topic button at the top of the page?You seemed to be able to raise https://forum.qt.io/topic/113963/udp-data-reception ?
-
@reshu
So when you go to https://forum.qt.io/category/10/general-and-desktop you do not see a big blue New Topic button at the top of the page?You seemed to be able to raise https://forum.qt.io/topic/113963/udp-data-reception ?