#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostInfo>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//本地主机名
QString hostName = QHostInfo::localHostName();
m_udpSocket = new QUdpSocket(this);
//socket QAbstractSocket::MulticastTtlOption值为1,MulticastTtlOption是
//组播的数据的生存期,数据报没跨1个路由就会减1.表示多播数据报只能在同一路由下的局域网内传播
m_udpSocket->setSocketOption(QAbstractSocket::MulticastTtlOption, 1);
connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(on_readyRead()));
/*
1 )发送 知道端口;设置 组播的数据的生存期 setSocketOption(QAbstractSocket::MulticastTtlOption, 1);
发送到指定的组IP
2)接收 设置信号槽, 绑定端口,
加入组 IP
groupAddress = QHostAddress("239.255.43.21");
udpSocket->joinMulticastGroup(groupAddress);
发送与接收 必须是相同的组
*/
//IP地址列表
ui->comboBox->clear();
//本机IP地址
#if 0
QHostInfo hostInfo = QHostInfo::fromName(hostName);
QList<QHostAddress> addrList = hostInfo.addresses();
for(int i = 0; i < addrList.count(); i++)
{
QHostAddress host = addrList.at(i);
if(QAbstractSocket::IPv4Protocol == host.protocol())
{
QString ip = host.toString();
ui->comboBox->addItem(ip);
}
}
#endif
ui->comboBox->addItem("239.255.255.250");
ui->comboBox->addItem("239.255.43.21");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnClear_clicked()
{
ui->plainTextEdit->clear();
}
void MainWindow::on_btnSend_clicked()//组播
{
//目标端口
quint16 groupPort = ui->spinBindPort->value();
QString msg = ui->lineEdit->text();
QByteArray str = msg.toUtf8();
QString IP = ui->comboBox->currentText();
groupAddr = QHostAddress(IP);
qDebug() << "Group Address" << groupAddr ;//groupAddr = QHostAddress("239.255.43.21");
//发出数据报
m_udpSocket->writeDatagram(str, groupAddr, groupPort);
ui->plainTextEdit->appendPlainText("[multicast] " + msg);
}
void MainWindow::on_readyRead()
{
while(m_udpSocket->hasPendingDatagrams())
{
QByteArray data;
data.resize(m_udpSocket->pendingDatagramSize());
QHostAddress peerAddr;
quint16 peerPort;
m_udpSocket->readDatagram(data.data(), data.size(), &peerAddr, &peerPort);
QString str = data.data();
QString peer = "[From ] +" + peerAddr.toString() + ":" + QString::number(peerPort) + "] ";
ui->plainTextEdit->appendPlainText(peer + str);
}
}
void MainWindow::on_btnJoin_clicked()
{
QString IP = ui->comboBox->currentText();
groupAddr = QHostAddress(IP);
qDebug() << "Group Address" << groupAddr ;//groupAddr = QHostAddress("239.255.43.21");
quint16 groupPort = ui->spinBindPort->value();
//加入组播之前,必须先绑定端口,端口为多播组统一的一个端口。
if(m_udpSocket->bind(QHostAddress::AnyIPv4, groupPort, QUdpSocket::ShareAddress))
{
//加入组播
m_udpSocket->joinMulticastGroup(groupAddr);
ui->plainTextEdit->appendPlainText("**加入组播成功");
ui->plainTextEdit->appendPlainText("**组播IP: " + IP);
ui->plainTextEdit->appendPlainText("**绑定端口: " + QString::number(groupPort));
ui->btnJoin->setEnabled(false);
ui->btnExit->setEnabled(true);
ui->comboBox->setEnabled(false);
}
else
{
ui->plainTextEdit->appendPlainText("**绑定端口失败");
}
}
void MainWindow::on_btnExit_clicked()
{
//退出组播
m_udpSocket->leaveMulticastGroup(groupAddr);
//解除绑定
m_udpSocket->abort();
ui->btnJoin->setEnabled(true);
ui->btnExit->setEnabled(false);
ui->comboBox->setEnabled(true);
ui->plainTextEdit->appendPlainText("**已退出组播");
}