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-palvelin
Projektitiedostoon täytyy lisätä määrittely network, jotta Qt ottaa mukaan verkkoasetukset
QT += network
Otsikkotiedostossa tulee esitellä udpSocket muuttuja
#include <QUdpSocket> ... //tehdään osoitinmuuttuja socketia varten QUdpSocket *udpSocket;
Koodissa liitetään socket porttiin ja lähetetään dataa
//muodostimeen varaukset ja liitynnät //varataan udpSocket muuttujalle muistia udpSocket = new QUdpSocket(this); // liitetään socket porttiin udpSocket->bind(45454, QUdpSocket::ShareAddress); ... void Dialog::on_sendMessage_clicked() { QString viesti=ui->lineEdit->text();//luetaan teksti lineEdit ikkunasta QByteArray datagram;//esitellään muuttuja, joka sisältää tietoa 8:n bitin pätkissä datagram.append(viesti);//lisätään viesti muuttujaan //kirjoitetaan viesti sockettiin udpSocket->writeDatagram(datagram.data(), datagram.size(),QHostAddress::Broadcast,45454); }
Lukuarvon lähetys udp-viestinä esimerkissä lähetetään vaa'alle taaraus tai taaran poisto käsky
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; } dataToRTSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45402); }
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.
udpSocket = new QUdpSocket(this); udpSocket->bind(45454, QUdpSocket::ShareAddress); connect(udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));
Ja vielä tehdään tiedolle vastaanottaja.
void Dialog::processPendingDatagrams() { //esitellään muuttuja tavujonolle QByteArray datagram; //otetaan dataa vastaan niin kaun kuin on tulossa while (udpSocket->hasPendingDatagrams()) { //sovitetaan muuttuja tulevaan dataan datagram.resize(udpSocket->pendingDatagramSize()); //luetaan data muuttujaan udpSocket->readDatagram(datagram.data(), datagram.size()); //esitetään muuttuja näytöllä ui->label->setText(tr("Received: \"%1\"") .arg(datagram.data())); } }