Приветствую всех.
Накидал приложение на QT 5.1.0, которое общается по Езернету с внешним устройством (плата с ПЛИСкой) с использованием UDP. Код взял с примера.
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
addressClient.setAddress("201.1.1.1");
udpSocket = new QUdpSocket(this);
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(read()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initServer()
{
bool ok = udpSocket->bind(1111); // Привязка собственного IP-адреса к порту 1111
// connect(udpSocket, SIGNAL(readyRead()),
// this, SLOT(read()));
if( ok )
{
/* QMessageBox::information(this, QObject::tr("Server"),
QObject::tr("The server is running on port 1111."));
*/
ui->label->setText("Init: Ok");
}
else
{
/* QMessageBox::critical(this, QObject::tr("Server"),
QObject::tr("Error :: %1.\n")
.arg(udpSocket->errorString()));
*/
ui->label->setText("Init: No");
}
}
void MainWindow::on_pushButton_clicked()
{
initServer();
}
void MainWindow::on_pushButton_2_clicked()
{
QByteArray data;
QDataStream out(&data, QIODevice::WriteOnly);
out << qint8(16) << qint8(38);
udpSocket->writeDatagram(data, addressClient, 1111);
// ui->label_2->setText("Error: " + QString::number(udpSocket->error()));
}
void MainWindow::read()
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
QHostAddress *address = new QHostAddress();
quint16 port = 0;
qDebug() << "read";
// do
// {
udpSocket->readDatagram(datagram.data(), datagram.size(), address, &port);
qDebug() << "QHostAddress: " << address->toString() << " sourcePort: " << port;
QDataStream in(&datagram, QIODevice::ReadOnly);
qDebug() << "size DataGram: " << in.device()->size();
qint8 a, b;
in >> a;
in >> b;
qDebug() << a << " " << b;
// }while(udpSocket->hasPendingDatagrams());
}
Данные в сети контролирую WireShark'ом.
Если нажать pushButton_2, то на плату приходит пакет, плата отвечает одной или двумя датаграммами, Qt-приложение принимает эти датаграммы, и все счастливы.
НО!! если плата сама инициирует передачу датаграммы в линию, отмечу САМА, а не в ответ на принятые данные, то Qt-приложение ни.. не реагирует.
Я уже пробовал с платы передавать в разные моменты, после небольшой паузы после двухстороннего обмена, до него, и нифига. Пакеты, отсылаемые с платы в обоих случаях, абсолютно одинаковые (даже идентификаторы пакетов и контр.суммы одинаковые).
Где что попинать, чтобы приложение принимало UDP-пакеты не после отправки своих данных.
З.Ы.: в Qt с сетями почти не работал.
З.З.Ы.: Когда-то делал два приложения клиент-сервер работающие на разных машинах - проблем не было. сервер и клиент принимали/отправляли данные.