Udp on tiedonsiirtoprotokolla, joka ei vaadi päästäpäähän varmistettua yhteyttä. Udp-yhteyden avulla voidaan siirtää kaikkea tietoa prosessien välillä ethernetin yli. Tieto siirretään QByteArray tyypin avulla eli tavuina. QDataStream tyypin avulla tieto voidaan serialisoida siten, että se on vastaanottavassa päässä helposti purettavissa samaksi tietotyypiksi kuin lähetyksessä. QUdpSocket tyypin avulla voidaan muodostaa lädettäjä ja vastaanottaja. Seuraava esimerkki pyrkiii kuvaamaan muuttujien arvojen siirtoa prosessilta toiselle.
esimerkki zipattuna BroadcastServer.zip
QByteArray
QDataStream
QUdpSocket
Code Block |
---|
#include "sender.h" SenderReceiver::SenderReceiver(QObject *parent) : QObject(parent) { sendUdpSocket = new QUdpSocket(0); receiveUdpSocket = new QUdpSocket(0); receiveUdpSocket->bind(45455,QUdpSocket::ShareAddress); connect(receiveUdpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams())); } //viestien lahetys void SenderReceiver::broadcastDatagram(QVector<float> v) { int error,i; QByteArray datagram; qDebug() << v; QDataStream out (&datagram,QIODevice::WriteOnly); foreach(float f,v) { out << f; } //kirjoitetaan udp-viesti, mahdollinen virhe kannattaisi tarkastaa error=sendUdpSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45455); } //viestien vastaanotto void SenderReceiver::processPendingDatagrams() { float f; //onko vastaanotettu viesteja while (receiveUdpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(receiveUdpSocket->pendingDatagramSize()); receiveUdpSocket->readDatagram(datagram.data(), datagram.size()); QDataStream in(datagram); while (!in.atEnd()){ in >> f; v2 << f; } qDebug() << v2; emit sendReceivedData(v2); } } |
Code Block |
---|
#ifndef #include "sender.h" SenderReceiver::SENDER_H #define SENDER_H #include <QObject> #include <QUdpSocket> class SenderReceiver : public QObject { Q_OBJECT public: explicit SenderReceiver(QObject *parent = 0) :; QUdpSocket *sendUdpSocket; QUdpSocket *receiveUdpSocket; void QObjectbroadcastDatagram(parentQVector<float> v) {; void testia(); sendUdpSocket = new QUdpSocket(0QVector<float> v2; signals: void sendReceivedData(QVector<float> v2); public slots: //viestejä receiveUdpSocketvastaanottava =slot newvoid QUdpSocketprocessPendingDatagrams(0); }; #endif // SENDER_H |
Code Block |
---|
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : receiveUdpSocket->bind(45455,QUdpSocket::ShareAddressQMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(receiveUdpSocket&sender, SIGNAL(readyReadsendReceivedData(QVector<float>)), this, SLOT(processPendingDatagramsdataReceivedSlot(QVector<float>))); } void SenderReceiverMainWindow::broadcastDatagram~MainWindow(QVector<float> v) { intdelete error,iui; QByteArray datagram; qDebug() << v; QDataStream out (&datagram,QIODevice::WriteOnly); foreach(float f,v) { out << f; } //kirjoitetaan udp-viesti, mahdollinen virhe kannattaisi tarkastaa error=sendUdpSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45455)} void MainWindow::on_pBSend_clicked() { QVector <float> v1; v1.append(ui->lE_Send->text().toFloat()); v1.append(ui->lE_Send_2->text().toFloat()); v1.append(ui->lE_Send_3->text().toFloat()); sender.broadcastDatagram(v1); } void SenderReceiverMainWindow::processPendingDatagramsdataReceivedSlot(QVector<float> v2) { floatint fi; //onko vastaanotettu viestejafloat ftmp; while (receiveUdpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(receiveUdpSocket->pendingDatagramSize()); receiveUdpSocket->readDatagram(datagram.data(), datagram.size()); QDataStream in(datagram); while (!in.atEnd()){ in >> f; v2 << f; } qDebug() << v2; emit sendReceivedData(v2); } }QString tmp=""; QString tmp2=""; int koko=v2.size(); for(i=0;i<koko;i++){ ftmp=v2.at(i); tmp.setNum(ftmp); tmp2+=tmp; tmp2+=" "; } ui->lE_Receive->setText(tmp2); } |
Code Block |
---|
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "sender.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
SenderReceiver sender;
private slots:
void on_pBSend_clicked();
private:
Ui::MainWindow *ui;
public slots:
void dataReceivedSlot(QVector<float> v2);
};
#endif // MAINWINDOW_H
|