UDP入门学习I

本文介绍了一个既能发送又能接收UDP数据的界面实现方法。详细讲述了如何在Qt环境中配置UDP套接字,包括发送端与接收端的设置,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标:实现一个界面发送和接收
注意:要在工程名的右键菜单中勾选NetWork library,并且在头文件中加上#include <QtNetwork>
这里写图片描述
1. UDP套接字
UDP套接字就是一个IP地址加一个port端口,因为我们要传输数据,就要知道往哪个机子上传送,而IP地址确定了一台主机,但是这台机子上可能运行着各种各样的网络程序,我们要往哪个程序中发送呢?这时就要使用一个端口来指定UDP程序。在使用前不需要进行连接。TCP协议与电话通信相似,而UDP协议则与邮件通信相似:你寄包裹或信件时不需要进行”连接”,但是你得为每个包裹和信件指定目的地址。类似的,每条信息(即数据报文,datagram)负载了自己的地址信息,并与其他信息相互独立。在接收信息时,UDP套接字扮演的角色就像是一个信箱,从不同地址发送来的信件和包裹都可以放到里面。一旦被创建,UDP套接字就可以用来连续地向不同的地址发送信息,或从任何地址接收信息。
  UDP套接字与TCP套接字的另一个不同点在于他们对信息边界的处理方式不同:UDP套接字将保留边界信息。这个特性使应用程序在接受信息时,从某些方面来说比使用TCP套接字更简单。
  最后一个不同点是,UDP协议所提供的端到端传输服务是尽力而为(best-effort)的,即UDP套接字将尽可能地传送信息,但并不保证信息一定能成功到达目的地址,而且信息到达的顺序与其发送顺序不一定一致(就像通过邮政部门寄信一样)。因此,使用了UDP套接字的程序必须准备好处理信息的丢失和重排。
2. 目标界面
这里写图片描述

  1. 头文件里面的声明
private:
    Ui::UDPMsgClass ui;
    QUdpSocket *udp_socket_rx;//接收端套接字
    QUdpSocket *udp_socket_tx;//发送端套接字
    QHostAddress Ip_tx;//发送端IP
    int Port_tx;//发送端Port

private slots:
    void on_btn_cfg_clicked();//配置按钮函数
    void on_btn_tx_clicked();//发送按钮函数
    void on_btn_clear_clicked();//清除按钮函数
    void rx_udp();//接收处理函数
  1. c文件的编写
    首先,在构造函数里面进行信号与槽函数的绑定。
    udp_socket_rx = new QUdpSocket(this);
    udp_socket_tx = new QUdpSocket(this);
    connect(ui.Btn_tx, SIGNAL(clicked()), this, SLOT(on_btn_tx_clicked()) );
    connect(ui.Btn_cfg, SIGNAL(clicked()), this, SLOT(on_btn_cfg_clicked()) );
    connect(ui.Btn_clear, SIGNAL(clicked()), this, SLOT(on_btn_clear_clicked()) );
    connect(udp_socket_rx, SIGNAL(readyRead()), this, SLOT(rx_udp()));//当接收套接字接收到数据时,转到rx_udp()函数进行处理
    ui.Btn_tx->setEnabled(false);//设置为不可按下
然后,再实现各个槽函数。
void UDPMsg::on_btn_clear_clicked(){//清屏函数
    ui.Bro_rx->clear();
    ui.Bro_tx->clear();
}
void UDPMsg::on_btn_cfg_clicked(){//配置函数
    bool ok;
    int Port_rx = 0;
    Ip_tx = QHostAddress(ui.Line_TxIP->text());
    Port_tx = ui.Line_TxPort->text().toInt(&ok);

    Port_rx = ui.Line_RxPort->text().toInt(&ok);
    udp_socket_rx->bind(Port_rx,QHostAddress::ShareAddress);//接收的套接字绑定相应的Port和IP


    ui.Btn_tx->setEnabled(true);//激活发送按钮
}
void UDPMsg::rx_udp(){//接收处理函数
    while (udp_socket_rx->hasPendingDatagrams())//当接收到报文数据时
    {
        QByteArray datagram;//因为传送来的数据类型是未知,所以用Bytearray
        datagram.resize(udp_socket_rx->pendingDatagramSize());//datagram的数据大小取决于接收到的数据

        udp_socket_rx->readDatagram(datagram.data(), datagram.size());//读取数据  
        ui.Bro_rx->append(datagram);//将报文显示到接收框
    }
}
void UDPMsg::on_btn_tx_clicked(){//发送按钮处理函数
    QByteArray datagram = ui.Bro_tx->toPlainText().toAscii();
    udp_socket_tx->writeDatagram(datagram, datagram.size(), Ip_tx, Port_tx);
}

注:因为是实现的同一个界面既发送又接收数据,所以其UDP端口号也要一样的,这样才能够正常的接收到发送的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值