mercoledì 27 marzo 2013

UDP Server in Qt

Creare un server UDP in Qt non e' banalissimo

per prima cosa si deve modificare il file .pro per aggiungere il modulo network
-------------------------------------------------
QT += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = udp_server
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui
-------------------------------------------------

successivamente sul file .h della finestra si aggiungono i riferimenti evidenziati in giallo
-------------------------------------------------
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QUdpSocket>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    QUdpSocket *udpSocket;

private slots:
void processPendingDatagrams();


};

#endif // MAINWINDOW_H
-------------------------------------------------

ed ecco la parte di codice che gestisce direttamente il server
in pratica si apre la porta di ascolto (in questo caso la 64009) e si connette una funzione di ascolto (processPendingData)
-------------------------------------------------
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QUdpSocket>
#include <QDebug>



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    udpSocket = new QUdpSocket(this);
   QHostAddress myAddr = QHostAddress("192.168.0.100") ;
   udpSocket->bind(myAddr, 7755);
   bool result = connect(udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::processPendingDatagrams()
{
QByteArray datagram;

do {
    datagram.resize(udpSocket->pendingDatagramSize());
    udpSocket->readDatagram(datagram.data(), datagram.size());
    qDebug() << datagram.data();
} while (udpSocket->hasPendingDatagrams());


}
-------------------------------------------------

per testare il tutto si puo' usare questo semplice codice di client UDP in Python
-------------------------------------------------
import socket

IPADDR = '192.168.0.100'
PORTNUM = 7755
PACKETDATA = 'Luca'
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.connect((IPADDR, PORTNUM))
s.send(PACKETDATA)
s.close()
-------------------------------------------------