Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

udp-protokolla on yksinkertaisin tiedonsiirtoprotokolla Ethernetin yli. Se ei vaadi kuittauksia, eikä siten varmista tiedon perille menoa, mutta varmistus voidaan toteuttaa muilla menetelmillä.

Udp-

...

asiakas

Projektitiedostoon täytyy lisätä määrittely network, jotta Qt ottaa mukaan verkkoasetukset

Code Block

QT       += network

Otsikkotiedostossa tulee esitellä udpSocket muuttuja

Code Block
#ifndef UDPASIAKASTOIMINNOT_H
#define UDPASIAKASTOIMINNOT_H

#include <QObject>
#include <QUdpSocket>
...

    //tehdään osoitinmuuttuja socketia varten //udp funktiot on täällä
#include <QDebug>

class UdpAsiakasToiminnot : public QObject
{
    Q_OBJECT
public:
    explicit UdpAsiakasToiminnot(QObject *parent = 0);
    QUdpSocket *udpSocket;udpLiitynta;
public slots:
void LueDataa();
void KirjoitaDataa(quint32 arvo);
};
#endif // UDPASIAKASTOIMINNOT_H

Koodissa liitetään socket porttiin ja lähetetään dataa

Code Block

//muodostimeen varaukset ja liitynnät
    //varataan udpSocket muuttujalle muistia#include "udpasiakastoiminnot.h"

UdpAsiakasToiminnot::UdpAsiakasToiminnot(QObject *parent)QObject(parent)
{
    udpSocket udpLiitynta= new QUdpSocket(this);
  // jos asiakas  // liitetään socket porttiinhaluaisi myos lukea, niin myos seuraavat
  //  udpSocketudpLiitynta->bind(4545445401, QUdpSocket::ShareAddress);
  //  connect(udpLiitynta,SIGNAL(readyRead()),this,SLOT(LueDataa()));
}

void UdpAsiakasToiminnot::LueDataa()
{
 ...}

void DialogUdpAsiakasToiminnot::on_sendMessage_clicked(KirjoitaDataa(quint32 arvo)
{
    QVector<quint32> v;
 QString viesti=ui->lineEdit->text();//luetaan teksti lineEdit ikkunasta   v<<(quint32)1;//viestin nimi
    v<<arvo;
    //QByteArray on tavuvektori
    QByteArray datagram;
    qDebug() <<"kirjoitetaan dataa "<< v;
    //esitellään muuttuja, joka sisältää tietoa 8:n bitin pätkissä
    datagram.append(viesti);//lisätään viesti muuttujaanQDataStream tyyppinä voi lähettää perättäistä tietoa io-laittelle
     QDataStream out (&datagram,QIODevice::WriteOnly);
    //foreach - kopioi vuorollaan jokainen v:n alkio f muuttujaan ja lisää
    //kirjoitetaan viesti sockettiin jokainen f out:n jatkoksi
    foreach(quint32 f,v) { out << f; }
    udpSocketudpLiitynta->writeDatagram(datagram.data(), datagram.size(),                      QHostAddress::Broadcast,45454 45401);
    qDebug()<<"data kirjoitettiin";
}

 

 

Udp-

...

palvelin

Projekti- ja otsikkotiedotoihin tehdään samat lisäykset kuin palvelimessa.

Esimerkiksi muodostimessa tehdään taas liitäntä ja liitetään udpSocketin "valmis signaali" tiedon vastaanottajaan.

 

Ja vielä tehdään tiedolle vastaanottaja.

Code Block
#ifndef UDPPALVELINTOIMINNOT_H
#define UDPPALVELINTOIMINNOT_H
#include <QObject>
#include <QUdpSocket> //udp funktiot on täällä

class UdpPalvelinToiminnot : public QObject
{
    Q_OBJECT
public:
    explicit UdpPalvelinToiminnot(QObject *parent = 0);
    QUdpSocket *udpLiitynta;
signals:
    void Tulokset(qint32);
public slots:
    void LueDataa();
};
#endif // UDPPALVELINTOIMINNOT_H

Seuraavassa koodissa on esitetty numeerisen datan luku udp-väylältä

Code Block
#include "udppalvelintoiminnot.h" //#include <QReadLocker>
 //QReadWriteLock lukulukko;
 UdpPalvelinToiminnot::UdpPalvelinToiminnot(QObject *parent) :
 QObject(parent)
 {
    udpLiitynta=
udpSocket = new QUdpSocket(this);
    udpSocketudpLiitynta->bind(4545445401, QUdpSocket::ShareAddress);
    connect(udpSocketudpLiitynta, SIGNAL(readyRead()),this, SLOT(processPendingDatagramsLueDataa()));

Ja vielä tehdään tiedolle vastaanottaja.

Code Block

void Dialog::processPendingDatagrams }
 void UdpPalvelinToiminnot::LueDataa()
 {
    //esitellään muuttuja tavujonolle
    QByteArray datagramqint32 f;
    //otetaan dataa vastaan niin kaun kuin on tulossaqDebug() << "udpLiitynta";
    while (udpSocketudpLiitynta->hasPendingDatagrams()) {
    	QByteArray datagram;
     //sovitetaan muuttuja tulevaan dataan datagram.resize(udpLiitynta->pendingDatagramSize());
        udpLiitynta->readDatagram(datagram.resize(udpSocket->pendingDatagramSizedata(), datagram.size());
        //luetaan data muuttujaanQDataStream in(datagram);
        in>>f;
        udpSocket->readDatagram(datagram.data(), datagram.size());if(f==(qint32) 1 )
        {
        //esitetään muuttuja näytölläin>>f;
        ui->label->setText(tr("Received: \"%1\"") .arg(datagram.data()))  qDebug()<<"tulokset "<<f;
          emit Tulokset(f);
          return;
        }
    }
 }