...
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 |
---|
#include "udpasiakastoiminnot.h" UdpAsiakasToiminnot::UdpAsiakasToiminnot(QObject *parent)QObject(parent) { udpLiitynta=new QUdpSocket(this); // jos asiakas haluaisi myos lukea, niin myos seuraavat // udpLiitynta->bind(45401,QUdpSocket::ShareAddress); // connect(udpLiitynta,SIGNAL(readyRead()),this,SLOT(LueDataa())); } void UdpAsiakasToiminnot::LueDataa() { } void UdpAsiakasToiminnot::KirjoitaDataa(quint32 arvo) { QVector<quint32> v; v<<(quint32)1;//viestin nimi v<<arvo; //QByteArray on tavuvektori QByteArray datagram; 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ää // jokainen f out:n jatkoksi foreach(quint32 f,v) { out << f; } udpLiitynta->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45401); qDebug()<<"data kirjoitettiin"; } |
Seuraavan on esimerkki lukuarvon lähetyksestä udp-viestinä, esimerkissä simuloidaan CAN viestin välitystä
Code Block |
---|
void CAN_MessageWithUdp::WriteCAN_Message(quint8 Id,quint64 message)
{
QVector<qint64> v;
v<<(qint64)Id;
v<<(qint64) message;
QByteArray datagram;
QDataStream out (&datagram,QIODevice::WriteOnly);
foreach(qint64 f,v) { out << f; }
dataCANSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45402);
}
|
...
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 |
---|
void Dialog::processPendingDatagrams() { //esitellään muuttuja tavujonolle QByteArray datagram; //otetaan dataa vastaan niin kaun kuin on tulossa while (udpSocket->hasPendingDatagrams()) { //sovitetaan muuttuja tulevaan dataan#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 datagram.resize(udpSocket->pendingDatagramSize())= 0); //luetaan data muuttujaanQUdpSocket *udpLiitynta; signals: udpSocket->readDatagram(datagram.data(), datagram.size()); //esitetään muuttuja näytöllävoid Tulokset(qint32); public slots: ui->label->setText(tr("Received: \"%1\"") .arg(datagram.data())); } }void LueDataa(); }; #endif // UDPPALVELINTOIMINNOT_H |
Seuraavassa koodissa on esitetty numeerisen datan luku udp-väylältä
...