#include "multicast.h"
#include "ui_multicast.h"
#include <QtNetwork/QNetworkInterface>
#include <QSettings>
Multicast::Multicast(QWidget *parent) :
QDialog(parent),
ui(new Ui::Multicast)
{
ui->setupUi(this);
QList<QNetworkInterface> &lni = QNetworkInterface::allInterfaces();
for (int i = 0; i < lni.size(); i++)
{
ui->comboBoxNetwork->addItem(lni[i].humanReadableName());
}
QSettings settings("XxTec", "Multicast");
settings.beginGroup("Multicast");
ui->comboBoxNetwork->setCurrentText(settings.value("NetworkCard").toString());
ui->lineEditGroupIP->setText(settings.value("Group").toString());
ui->spinBoxPort->setValue(settings.value("Port").toInt());
ui->spinBoxPeerPort->setValue(settings.value("PeerPort").toInt());
}
Multicast::~Multicast()
{
delete ui;
}
void Multicast::readPendingDatagrams()
{
while (m_UdpSocket.hasPendingDatagrams())
{
qint64 nTime = *(qint64*)m_UdpSocket.receiveDatagram().data().data();
ui->dateTimeEdit->setDateTime(QDateTime::fromSecsSinceEpoch(nTime));
}
}
void Multicast::on_pushButtonInit_clicked()
{
QSettings settings("XxTec", "Multicast");
settings.beginGroup("Multicast");
settings.setValue("NetworkCard", ui->comboBoxNetwork->currentText());
settings.setValue("Group", ui->lineEditGroupIP->text());
settings.setValue("Port", ui->spinBoxPort->value());
settings.setValue("PeerPort", ui->spinBoxPeerPort->value());
QString strMulticastNetworkCard = settings.value("NetworkCard").toString();
QString strGroup = settings.value("Group").toString();
short nPort = settings.value("Port").toInt();
short nPeerPort = settings.value("PeerPort").toInt();
int nIndex = 0;
const QList<QNetworkInterface> &lni = QNetworkInterface::allInterfaces();
for (int i = 0; i < lni.size(); i++)
{
if (lni[i].humanReadableName().indexOf(strMulticastNetworkCard) >= 0)
{
nIndex = i;
break;
}
}
QHostAddress groupAddr(strGroup);
m_Datagram.setDestination(groupAddr, nPeerPort);
bool b = m_UdpSocket.bind(QHostAddress::AnyIPv4, nPort, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
//多网卡时为了能够建立正确的组播路由,必须先设置组播网卡setMulticastInterface,再加入组播组joinMulticastGroup,
//并且加入组播的同时指定网卡joinMulticastGroup(groupAddr, lni[nIndex])
m_UdpSocket.setMulticastInterface(lni[nIndex]);
b = m_UdpSocket.joinMulticastGroup(groupAddr, lni[nIndex]);
connect(&m_UdpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}
void Multicast::on_pushButtonStart_clicked()
{
unsigned char ucCmd = 0;
QByteArray ba((char*)&ucCmd, sizeof(ucCmd));
m_Datagram.setData(ba);
m_UdpSocket.writeDatagram(m_Datagram);
}
void Multicast::on_pushButtonStop_clicked()
{
unsigned char ucCmd = 1;
QByteArray ba((char*)&ucCmd, sizeof(ucCmd));
m_Datagram.setData(ba);
int kk = m_UdpSocket.writeDatagram(m_Datagram);
}