Periaate
...
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 {code} |
Otsikkotiedostossa
...
tulee
...
esitellä
...
udpSocket
...
muuttuja
Code Block |
---|
#ifndef UDPASIAKASTOIMINNOT_H
#define UDPASIAKASTOIMINNOT_H
#include <QObject>
#include <QUdpSocket> //udp funktiot on täällä
#include <QDebug>
class UdpAsiakasToiminnot : public QObject
{
Q_OBJECT
public:
explicit UdpAsiakasToiminnot(QObject *parent = 0);
QUdpSocket *udpLiitynta;
public slots:
void LueDataa();
void KirjoitaDataa(quint32 arvo);
};
#endif // UDPASIAKASTOIMINNOT_H
|
Koodissa liitetään socket porttiin ja lähetetään dataa
Code Block |
---|
#include "udpasiakastoiminnot.h" UdpAsiakasToiminnot::UdpAsiakasToiminnot(QObject *parent)QObject(parent) { udpLiitynta= {code} #include <QUdpSocket> ... //tehdään osoitinmuuttuja socketia varten QUdpSocket *udpSocket; {code} Koodissa liitetään socket porttiin ja lähetetään dataa {code} //muodostimeen varaukset ja liitynnät //varataan udpSocket muuttujalle muistia udpSocket = new QUdpSocket(this); // // liitetään socket porttiinjos asiakas haluaisi 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;//esitellään muuttuja, joka sisältää tietoa 8:n bitin pätkissä datagram.append(viesti);//lisätään viesti muuttujaan qDebug() <<"kirjoitetaan dataa "<< v; //QDataStream 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); } {code qDebug()<<"data kirjoitettiin"; } h2. Udp-asiakas 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. {code} udpSocket = |
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=new QUdpSocket(this); udpSocketudpLiitynta->bind(4545445401, QUdpSocket::ShareAddress); connect(udpSocketudpLiitynta, SIGNAL(readyRead()),this, SLOT(processPendingDatagramsLueDataa())); {code} Ja vielä tehdään tiedolle vastaanottaja. {code} void Dialog::processPendingDatagrams() { //esitellään muuttuja tavujonolle } void UdpPalvelinToiminnot::LueDataa() { qint32 f; qDebug() << "udpLiitynta"; while (udpLiitynta->hasPendingDatagrams()) { QByteArray datagram; //otetaan dataa vastaan niin kaun kuin on tulossa datagram.resize(udpLiitynta->pendingDatagramSize()); while (udpSocket->hasPendingDatagramsudpLiitynta->readDatagram(datagram.data(), datagram.size()) { ; QDataStream in(datagram); //sovitetaan muuttuja tulevaan dataanin>>f; datagram.resize(udpSocket->pendingDatagramSize());if(f==(qint32) 1 ) { //luetaan data muuttujaanin>>f; udpSocket->readDatagram(datagram.data(), datagram.size()); qDebug()<<"tulokset "<<f; //esitetään muuttuja näytölläemit Tulokset(f); ui->label->setText(tr("Received: \"%1\"") .arg(datagram.data())); return; } } {code } |