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);
    }
}
相关推荐
千殃sama29 分钟前
Linux高并发服务器开发(十一)UDP通信和本地socket通信
linux·服务器·网络·笔记·学习·udp
今天你fpga了嘛41 分钟前
以太网协议介绍——UDP
网络·网络协议·udp
hgdlip1 小时前
ip地址是固定的还是经常变换的
网络·网络协议·tcp/ip
季截2 小时前
rpc的仅有通信的功能,在网断的情况下,比网通情况下,内存增长会是什么原因
网络·网络协议·rpc
sz66cm2 小时前
网络协议 -- IP、ICMP、TCP、UDP字段解析
网络协议·tcp/ip·udp
xy189903 小时前
http 状态码主要有哪些?【面试】
网络·网络协议·http
阿龍17876 小时前
Qt中udp指令,大小端,帧头帧尾实际示例
网络·c++·qt·网络协议·udp
andylauren8 小时前
Hi3861 OpenHarmony嵌入式应用入门--UDP Server
udp·openharmony
&木头人&9 小时前
JavaScript如何声明json对象
javascript·udp·json
喜欢猪猪18 小时前
websocket的工作原理
网络·websocket·网络协议