はい、それでは表題の件やっていきます。
サンプルはC++ GUI Programming with Qt4のものは長すぎなので、独自のものを使用します。
いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
また.proファイルに QT += network を必ず追加してください。(でなければ動きません。)
ではコードを
(mainwindow.h)
#include <QMainWindow> #include <QUdpSocket> #include <QDataStream> #include <QByteArray> #include <QDateTime> #include <QMessageBox> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); protected slots: void sendDatagram(); void processPendingDatagram(); void showMessage(); private: Ui::MainWindow *ui; QUdpSocket udpsocket1;//送信側 QUdpSocket udpsocket2;//受信側 QString message; };
(mainwindow.cpp)
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); udpsocket2.bind(5824); connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(sendDatagram())); connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(showMessage())); connect(&udpsocket2, SIGNAL(readyRead()), this, SLOT(processPendingDatagram())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::sendDatagram() { QByteArray datagram; QDataStream out(&datagram, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_1); out << QDateTime::currentDateTime() ; udpsocket1.writeDatagram(datagram, QHostAddress::LocalHost, 5824); } void MainWindow::processPendingDatagram() { QByteArray datagram; do { datagram.resize(udpsocket2.pendingDatagramSize()); udpsocket2.readDatagram(datagram.data(), datagram.size()); } while (udpsocket2.hasPendingDatagrams()); QDateTime dateTime; QDataStream in(&datagram, QIODevice::ReadOnly); in.setVersion(QDataStream::Qt_4_1); in >> dateTime; message = dateTime.time().toString(); } void MainWindow::showMessage() { ui->label->setText(message); }
はい簡単ですね。(Mainwindowにはあらかじめボタン2つとラベルを1つ配置しておいてください。)ヘッダ部はコメントのとおりです。説明はしません。
.cppは説明します。
まずはコンストラクタです。
受信用のudpsocket2のbindで受信を開始します。ポートは5824です。その後各シグナルを接続しています。これは見てのとおりですので説明省略します。
次のデストラクタは省略。
次にsendDatagram()です。
これは送信用のプッシュボタンのclicked()シグナルに対応して呼ばれるスロットです。コンストラクタでconnectしましたね。ここではただ単に現在の時間(QDateTime)をlocalhostのポート5824に送信しています。
次にprocessPendingDatagram()です。これはudpsocket2のreadyRead()シグナルに対応して呼ばれるスロットです。すなわちデータを受信すると呼ばれるということです。これもコンストラクタでconnectしましたね。ここでは受け取ったデータをQDateTimeとして取り出し、メンバのmessageに時刻を格納しています。ちなみにhasPendingDatagrams()はtrueの場合は少なくとも一つ以上の読込待ちがあることを指し、falseは全て読み込んだこと、あるいは読み込んでいない状態を指します。
最後にshowMessage()です。
これは状態表示用のプッシュボタンのclicked()シグナルに対応して呼ばれるスロットです。これもコンストラクタでconnectしましたね。これはただメンバのmessageをラベルにsetTextでセットしているだけです。
(QUdpSocket リファレンス)
実行すると以下のようになります。
(初期状態)
(UDP送信ボタンを押した後、状態表示ボタンを押した時の画像)
以上です。