QT进行UDP通信的学习(单播,组播,广播)

QT版本:Qt 5.5.1 (MSVC 2013, 32 bit)
Qt Creator版本:Qt Creator 3.5.1 (opensource)
系统:win10
1.打开QtCreator——新建项目——点击Application——Qt Widgets Application——choose
如图:
在这里插入图片描述
2. 项目名称输入QtUdpTest——一路点下一步
3. 在QtUdpTest.pro中增加一行

QT += core gui network

4.在mainwindow.h中增加头文件

#include <QUdpSocket>//注:必须先操作3再操作4,否则系统会提示 no such file or directory

5.主界面如图设计:
在这里插入图片描述
一个供用户输入的要发送的信的textEdit,一个单播发送按钮,一个多播发送按钮,一个广播发送按钮

一、 单播
1.创建套接字
在MainWindow.h中添加定义:

QUdpSocket       *m_qudpSocket;

在MainWindow 构造函数中添加:

m_qudpSocket = new QUdpSocket(); 

2.发送数据到制定的地址和端口号
在pushButtonUnicast按钮添加clicked()曹信号,并在信号接收函数中添加如下代码:

m_qudpSocket->writeDatagram(ui->textEditSendData->toPlainText().toUtf8(),QHostAddress("127.0.0.1"),3956);

3.接收代码编写:
在主界面添加一个Label,文字内容为RecvData:,添加一个TextEdit(取名为textEditRecvData),如下图:
在这里插入图片描述
在MainWindow构造函数中添加如下代码:

quint16 nport = 3956;
QString strIP = "127.0.0.1";
m_qudpSocket->bind(QHostAddress(strIP),nport);//绑定本地接收端IP及端口(针对单播接收)
connect(m_qudpSocket,SIGNAL(readyRead()),this,SLOT(RecvData()));

在头文件中添加如下代码:

public slots:
void RecvData();

在.cpp文件中添加如下代码::

void MainWindow::RecvData()
{
    QByteArray baRecv;
    while(m_qudpSocket->hasPendingDatagrams())
    {
        baRecv.resize(m_qudpSocket->pendingDatagramSize());
        m_qudpSocket->readDatagram(baRecv.data(),baRecv.size());
        QString strRecvData = baRecv;
        ui->textEditRecvData->setPlainText(strRecvData);
        qDebug()<<baRecv.data();
    }
    qDebug()<<"break\n";
}

执行程序,在SendData:右侧输入发送的数据内容,在RecvData:右侧会实时显示接收到的内容。
软件流程为:通过m_qudpSocket向本机ip:127.0.0.1的3956端口发送数据,同时,m_qudpSocket绑定了本机的接收ip:127.0.0.1,接收端口:3956,所以是m_qudpSocket把发送和接收一起包办了,运行结果见下图:
在这里插入图片描述

二、 组播
1.组播只有ip地址和单播有区别
假设组播IP是:224.0.0.1
在pushButtonMulticast按钮添加clicked()信号槽,并在信号接收函数中添加如下代码:

m_qudpSocket->joinMulticastGroup(QHostAddress("224.0.0.10")); //加入组播ip:224.0.0.10
m_qudpSocket->writeDatagram(ui->textEditSendData->toPlainText().toUtf8(),QHostAddress("224.0.0.10"),3956);

注意:
1、发送端既可以加入组播,也可以不加入组播;
2、服务端绑定的ip地址必须是ipv4地址, QHostAddress::Any即是ipv4地址;
3、组播ip必须是D类ip(A类IP段 1.0.0.0 到126.255.255.255 (0段和127段不使用)
B类IP段 128.0.0.0 到191.255.255.255
C类IP段 192.0.0.0 到223.255.255.255
D类IP段 224.0.0.0 到 239.255.255.255。

4、组播地址不能是224.0.0.1!
5、本机ip地址与组播地址无关,可以根据自己喜好随意配置!
2. 接收代码编写:
在构造函数中编写如下代码:

    m_qudpSocket->bind(QHostAddress::AnyIPv4,3956,QUdpSocket::ShareAddress);//绑定所有ip来接收组播组信息
    m_qudpSocket->joinMulticastGroup(QHostAddress("224.0.0.10"));//加入组播组ip:224.0.0.10
    m_qudpSocket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,1024*1024*8);//设置缓冲区
connect(m_qudpSocket,SIGNAL(readyRead()),this,SLOT(RecvData()));//连接接收信号槽

其他代码同单播相同

三、 广播,广播也只有ip地址和单播有区别
在pushButtonBroadcast按钮添加clicked()信号槽,并在信号接收函数中添加如下代码:
m_qudpSocket->writeDatagram(ui->textEditSendData->toPlainText().toUtf8(),QHostAddress::Broadcast,3956);

展开阅读全文

没有更多推荐了,返回首页