72-UDP协议工作原理及实战

复制代码
#ifndef UDPCOMM_H
#define UDPCOMM_H

#include <QMainWindow>
#include <QUdpSocket> // 用于发送和接收UDP数据报
#include <QtNetwork>


QT_BEGIN_NAMESPACE
namespace Ui { class udpComm; }
QT_END_NAMESPACE

class udpComm : public QMainWindow
{
    Q_OBJECT

public:
    udpComm(QWidget *parent = nullptr);
    ~udpComm();

private slots:
    void on_pushButton_start_clicked();

    void on_pushButton_stop_clicked();

    void on_pushButton_sengmsg_clicked();

    void on_pushButton_broadastmsg_clicked();

private:
    Ui::udpComm *ui;
    // 自定义函数获取本机的IP地址
public:
    QUdpSocket *udpsocket;

    QString GetLocalIpAddress(); // 获取本机IP地址

    // 自己定义槽
private slots:
    void  SocketReadyReadData(); // 读取socket传输数据信息
};
#endif // UDPCOMM_H



//.c




#include "udpcomm.h"
#include "ui_udpcomm.h"
#include <QMessageBox>

udpComm::udpComm(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::udpComm)
{
    ui->setupUi(this);

    QString strip=GetLocalIpAddress(); // 调用此函数返回对应本机IP地址
    QMessageBox::information(this,"结果",strip,QMessageBox::Yes);

    ui->comboBoxtargetip->addItem(strip); // 将IP地址显示到comboBox控件

    udpsocket=new QUdpSocket(this);

    connect(udpsocket,SIGNAL(readyRead()),this,SLOT(SocketReadyReadData()));

}

udpComm::~udpComm()
{
    delete ui;
}


void udpComm::on_pushButton_start_clicked()
{

    quint16 port=ui->spinBoxbindport->value(); // 本机UDP端口

    if(udpsocket->bind(port))
    {
        ui->plainTextEditdispmsg->appendPlainText("**********绑定成功**********");
        ui->plainTextEditdispmsg->appendPlainText("$$$$$$$$$$绑定端口$$$$$$$$$$:"+
                                                  QString::number(udpsocket->localPort()));
        ui->pushButton_start->setEnabled(false);
        ui->pushButton_stop->setEnabled(true);

    }
    else
    {
        ui->plainTextEditdispmsg->appendPlainText("**********绑定失败**********");
    }
}


void udpComm::on_pushButton_stop_clicked()
{
    udpsocket->abort();
    ui->pushButton_start->setEnabled(true);
    ui->pushButton_stop->setEnabled(false);
    ui->plainTextEditdispmsg->appendPlainText("**********已经停止服务**********");

}


void udpComm::on_pushButton_sengmsg_clicked()
{
    QString targetIpAddress=ui->comboBoxtargetip->currentText(); // 获取目标IP地址
    QHostAddress targetaddress(targetIpAddress);

    quint16 targetport=ui->spinBoxtargetport->value(); // 获取端口

    QString strmsg=ui->lineEditmsg->text(); // 获取发送消息内容

    QByteArray str=strmsg.toUtf8();

    udpsocket->writeDatagram(str,targetaddress,targetport); // 发送数据报信息

    ui->plainTextEditdispmsg->appendPlainText("[out]:"+str);
    ui->lineEditmsg->clear(); // 清除编辑框控件内容
    ui->lineEditmsg->setFocus(); // 将光标焦点定位到编辑框控件

}


void udpComm::on_pushButton_broadastmsg_clicked()
{

 quint16 targetport=ui->spinBoxtargetport->value(); // 获取端口
    QString strmsg=ui->lineEditmsg->text(); // 获取发送消息内容
    QByteArray str=strmsg.toUtf8();

    udpsocket->writeDatagram(str,QHostAddress::Broadcast,targetport); // 发送数据报信息

    ui->plainTextEditdispmsg->appendPlainText("[broadcast]:"+str);
    ui->lineEditmsg->clear(); // 清除编辑框控件内容
    ui->lineEditmsg->setFocus(); // 将光标焦点定位到编辑框控件
}

QString udpComm::GetLocalIpAddress()
{

    // 根据主机名称,获取IP地址
    QString strHostName=QHostInfo::localHostName();
    QHostInfo hostinfo=QHostInfo::fromName(strHostName); //  通过主机名称获取IP地址

    QString strLocalIp="";

    QList<QHostAddress> addresslist=hostinfo.addresses(); // IP地址列表

    if(!addresslist.isEmpty())
    {
        for(int i=0;i<addresslist.count();i++)
        {
            QHostAddress hostaddr=addresslist.at(i);

            if(QAbstractSocket::IPv4Protocol==hostaddr.protocol())
            {
                strLocalIp=hostaddr.toString();
                break;
            }
        }
    }

    return strLocalIp;
}

void udpComm::SocketReadyReadData()
{

    // 读取接收到的数据报信息
    // 用此函数返回true至少有一个数据报需要读取
    while(udpsocket->hasPendingDatagrams())
    {
        QByteArray datagrams;

        datagrams.resize(udpsocket->pendingDatagramSize());

        QHostAddress paddress;
        quint16 pport;

        // 通过readDatagram()此函数读取数据报,
        udpsocket->readDatagram(datagrams.data(),datagrams.size(),&paddress,&pport);

        QString strs=datagrams.data();
        QString peer="[From:"+paddress.toString()+":"+QString::number(pport)+"]:";

        ui->plainTextEditdispmsg->appendPlainText(peer+strs);
    }
}
相关推荐
千鼎数字孪生-可视化18 小时前
WebSocket实时推送技术:PLC状态监控大屏的高效实现路径
网络·websocket·网络协议
蒋星熠18 小时前
破壁者指南:内网穿透技术的深度解构与实战方法
网络·数据库·redis·python·websocket·网络协议·udp
zqy022721 小时前
HTTP的Web服务测试在Python中的实现
python·网络协议·http
GilgameshJSS1 天前
【学习K230-例程21】GT6700-UDP-Client
网络·python·单片机·网络协议·学习·udp
波波烤鸭1 天前
Netty 实战应用:从 RPC 到即时通讯,再到 WebSocket
websocket·网络协议·rpc
土星碎冰机1 天前
数据库开启ssl
数据库·网络协议·ssl
Leo来编程1 天前
七层网络协议-面试
网络·网络协议·面试
新鲜萝卜皮1 天前
你知道TCP的半连接队列和全连接队列吗?
网络协议
xiaoxiongip6661 天前
动态ip适合挂什么项目
网络·爬虫·python·网络协议·tcp/ip·ip
站长朋友1 天前
什么是OCSP装订(OCSP Stapling)?它如何加速SSL握手?
网络·网络协议·ssl·ocsp装订·https握手优化·tls扩展配置·ssl证书国内节点