Qt broadcastreceiver is not working with sender on Linux. sender is written in c.
I have tested Qt broadcastreceiver with Qt broadcastsender on windows which is ok and also Qt broadcastsender working fine with linux receiver which is in C.
what may be the problem while receiving data from linux on windows.
here is the code for the same.
sender (Qt/windows):
main.cpp
#include <QApplication>
#include "receiver.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Receiver receiver;
receiver.show();
return app.exec();
}
receiver.h
#ifndef RECEIVER_H
#define RECEIVER_H
#include <QtGui>
#include <QtNetwork/QUdpSocket>
#include <QWidget>
class Receiver : public QWidget
{
Q_OBJECT
public:
Receiver(QWidget *parent = 0);
private slots:
void processPendingDatagrams();
private:
QLabel *statusLabel;
QPushButton *quitButton;
QUdpSocket *udpSocket;
};
#endif
receiver.cpp
#include <QtGui>
#include <QtNetwork>
#include "receiver.h"
#define PORT 45454
Receiver::Receiver(QWidget *parent): QWidget(parent)
{
statusLabel = new QLabel(tr("Listening for broadcasted messages"));
statusLabel->setWordWrap(true);
quitButton = new QPushButton(tr("&Quit"));
udpSocket = new QUdpSocket(this);
bool b = udpSocket->bind(QHostAddress::Any,PORT, QUdpSocket::ShareAddress);
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch(1);
buttonLayout->addWidget(quitButton);
buttonLayout->addStretch(1);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(statusLabel);
mainLayout->addLayout(buttonLayout);
setLayout(mainLayout);
setWindowTitle(tr("Broadcast Receiver"));
}
void Receiver::processPendingDatagrams()
{
while (udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
udpSocket->readDatagram(datagram.data(), datagram.size());
statusLabel->setText(statusLabel->text() + tr("Received datagram: \"%1\"").arg(datagram.data()));
}
}
broadcastreceiver.pro
HEADERS = receiver.h
SOURCES = receiver.cpp \
main.cpp
QT += network
# install
target.path = $$[QT_INSTALL_EXAMPLES]/network/broadcastreceiver
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS broadcastreceiver.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/network/broadcastreceiver
INSTALLS += target sources
symbian: {
TARGET.CAPABILITY = NetworkServices
include($$PWD/../../symbianpkgrules.pri)
}
maemo5: include($$PWD/../../maemo5pkgrules.pri)
contains(MEEGO_EDITION,harmattan): include($$PWD/../../harmattanpkgrules.pri)
sender.c (C/Linux)
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define BUFLEN 512
#define NPACK 10
#define PORT 45454
#define SRV_IP "xxx.xxx.xxx.xxx"
void diep(char *s)
{
perror(s);
exit(1);
}
int main(void)
{
struct sockaddr_in si_other;
int s, i, slen=sizeof(si_other);
char buf[BUFLEN];
if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
{
diep("socket");
printf("\n\tSocket error\n");
}
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
if (inet_aton(SRV_IP, &si_other.sin_addr)==0)
{
fprintf(stderr, "inet_aton() failed\n");
printf("\n\tInet_aton error\n");
exit(1);
}
for (i=0;; i++)
{
printf("Sending packet %d\n", i);
sprintf(buf, "This is packet %d\n", i);
if (sendto(s, buf, BUFLEN, 0, &si_other, slen)==-1)
{
diep("sendto()");
printf("\n\tSendto error\n");
}
printf("Data written on (IP = %s and port : %d\n\n",inet_ntoa(si_other.sin_addr),ntohs(si_other.sin_port));
sleep(1);
}
close(s);
return 0;
}
Regards,
Gurmeet
I have tried it out your code and almost everything is working fine.
The only problem is, that arriving packages are not displayed correctly in your view.
After the first package arrives, it says:
Then it stops, because the content of the packet is a 0 byte which terminates the QString.
This also means that all following messages are not displayed anymore.
I don’t know if this solves your problem, maybe no data arrives at all.
I am using Linux, I can not assure you anything for Windows (although Qt should work as well on Windows as on Linux) but I can assure you that your code is working on Linux.