Qt 09UDP通信

1.UdpServer

1.构建udp套接字
    socket = new QUdpSocket;
2.绑定,将ip和port共享到网络:
    bind();
    socket->bind(QHostAddress::AnyIPv4, ui->lineEdit->text().toInt())
3.接收数据
    readDatagram() :udp的接收数据
    参数1:保存读取的数据的首地址          参数2:要读取的字节数
    参数3:保存数据来源的主机ip的首地址    参数4:保存数据来源的主机port的首地址
    eg:
    在成员中定义:
        QHostAddress addr;
        quint16 port;
    char buf[32] = {0};
    socket->readDatagram(buf, sizeof(buf), &addr, &port);
    ui->textEdit->insertPlainText(addr.toString() + ":" + QString(buf) + "\n");

4.发送数据
    writeDatagram(): 发送数据到另外一端
    参数1:发送的数据   参数2:数据接收端的ip地址   参数3:数据接收端的端口号
    socket->writeDatagram(ui->textEdit_2->toPlainText().toLatin1(),addr, port);

eg:

widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void on_pushButton_clicked();
    void recvData();
    void on_pushButton_2_clicked();
private:
    Ui::Widget *ui;
    QUdpSocket *socket;
    QHostAddress addr;
    quint16 port;
};
#endif // WIDGET_H
widget.c
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //构造udp套接字
    socket = new QUdpSocket;
    //当socket读缓存有数据,会立即触发readyRead
    connect(socket, &QUdpSocket::readyRead, this, &Widget::recvData);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::on_pushButton_clicked()
{
    // 绑定,就是将ip和port共享到网络
    //socket->bind(ui->lineEdit->text().toInt());
    if(socket->bind(QHostAddress::AnyIPv4, ui->lineEdit->text().toInt()))
        ui->pushButton->setDisabled(true);
}
void Widget::recvData()
{
    char buf[32] = {0};
    //readDatagram:udp的接收数据
    //参数1:保存读取的数据的首地址   参数2:要读取的字节数
    //参数3:保存数据来源的主机ip的首地址   参数4:保存数据来源的主机port的首地址
    socket->readDatagram(buf, sizeof(buf), &addr, &port);
    ui->textEdit->insertPlainText(addr.toString() + ":" + QString(buf) + "\n");
}
#include <QDebug>
void Widget::on_pushButton_2_clicked()
{
    // writeDatagram: 发送数据到另外一端
    // 参数1:发送的数据   参数2:数据接收端的ip地址   参数3:数据接收端的端口号
    qDebug() << socket->writeDatagram(ui->textEdit_2->toPlainText().toLatin1(),
                          addr, port);
    qDebug() << "size: " << ui->textEdit_2->toPlainText().size();
}

2.UdpClient

1.构建套接字
     socket = new QUdpSocket;    
2.发送数据
    socket->writeDatagram(ui->textEdit_2->toPlainText().toLatin1(),
                          QHostAddress(ui->lineEdit->text()),
                          ui->lineEdit_2->text().toUInt());
3.接收数据
    char buf[32] = {0};
    socket->readDatagram(buf, sizeof(buf));
    ui->textEdit->insertPlainText(QString(buf) + "\n");

eg:

widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void on_pushButton_clicked();
    void recvData();
private:
    Ui::Widget *ui;
    QUdpSocket *socket;
};
#endif // WIDGET_H
widget.c
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    socket = new QUdpSocket;
    connect(socket, &QUdpSocket::readyRead, this, &Widget::recvData);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::on_pushButton_clicked()
{
    socket->writeDatagram(ui->textEdit_2->toPlainText().toLatin1(),
                          QHostAddress(ui->lineEdit->text()),
                          ui->lineEdit_2->text().toUInt());
}
#include <QDebug>
void Widget::recvData()
{
        char buf[32] = {0};
        socket->readDatagram(buf, sizeof(buf));
        ui->textEdit->insertPlainText(QString(buf) + "\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值