函数 | 描述 |
---|---|
QUdpSocket(QObject *parent = nullptr) | 构造函数,创建一个新的 QUdpSocket 对象。 |
~QUdpSocket() | 析构函数,释放 QUdpSocket 对象及其资源。 |
void bind(const QHostAddress &address, quint16 port, BindMode mode = DefaultForPlatform) | 将套接字绑定到指定的本地地址和端口。 |
void close() | 关闭套接字。 |
bool joinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface = QNetworkInterface()) | 加入多播组。 |
bool leaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface = QNetworkInterface()) | 离开多播组。 |
qint64 pendingDatagramSize() const | 返回下一个待读取的数据报的大小。 |
qint64 readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr) | 读取数据报。 |
QByteArray readDatagram(qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr) | 读取数据报,返回 QByteArray 对象。 |
qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port) | 发送数据报。 |
qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &address, quint16 port) | 发送数据报,接受 QByteArray 对象。 |
QAbstractSocket::SocketState state() const | 返回套接字的当前状态。 |
QAbstractSocket::SocketType socketType() const | 返回套接字的类型。 |
bool isValid() const | 如果套接字有效,则返回 true;否则返回 false。 |
int error() const | 返回套接字的当前错误代码。 |
QHostAddress localAddress() const | 返回本地地址。 |
quint16 localPort() const | 返回本地端口。 |
int readBufferSize() const | 返回读取缓冲区的大小。 |
void setReadBufferSize(int size) | 设置读取缓冲区的大小。 |
QNetworkInterface multicastInterface() const | 返回多播组的网络接口。 |
void setMulticastInterface(const QNetworkInterface &iface) | 设置多播组的网络接口。 |
bool hasPendingDatagrams() const | 如果有待读取的数据报,则返回 true;否则返回 false。 |
bool isReadable() const | 如果套接字可读,则返回 true;否则返回 false。 |
bool isWritable() const | 如果套接字可写,则返回 true;否则返回 false。 |
bool setSocketDescriptor(int socketDescriptor, QUdpSocket::SocketState socketState = ConnectedState, QIODevice::OpenMode openMode = ReadWrite) | 设置套接字描述符。 |
int socketDescriptor() const | 返回套接字描述符。 |
bool waitForReadyRead(int msecs = 30000) | 等待套接字可读取数据。 |
bool waitForBytesWritten(int msecs = 30000) | 等待套接字已写入指定字节数的数据。 |
void ignoreSslErrors(const QList<QSslError> &errors) | 忽略 SSL 错误。 |
void abort() | 强制关闭套接字。 |
QNetworkProxy proxy() const | 返回套接字的代理设置。 |
void setProxy(const QNetworkProxy &networkProxy) | 设置套接字的代理设置。 |
QString errorString() const | 返回套接字的错误消息字符串。 |
QUdpSocket::QUdpSocket(QObject * parent = nullptr)如上构造函数创建一个新的 QUdpSocket 对象。如果提供了 parent 参数,则会将新创建的 QUdpSocket 对象添加到 parent 对象的子对象列表中,并且在 parent 对象被销毁时自动销毁 QUdpSocket 对象。如果没有提供 parent 参数,则 QUdpSocket 对象将不会有父对象,并且需要手动管理其生命周期。
void QUdpSocket::bind(const QHostAddress &address, quint16 port, BindMode mode = DefaultForPlatform)address:要绑定的本地地址,通常是 QHostAddress::Any,表示绑定到所有可用的网络接口。
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); udpSocket=new QUdpSocket(this); // 堆代码 duidaima.com // 生成随机整数 包含2000 - 不包含65534 int randomInt = QRandomGenerator::global()->bounded(2000, 65534); if(udpSocket->bind(randomInt)) { this->setWindowTitle(this->windowTitle() + " | 地址: " + getLocalAddress() + " 绑定端口:" + QString::number(udpSocket->localPort())); } connect(udpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState))); onSocketStateChange(udpSocket->state()); connect(udpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead())); }接着切换到读取信号所对应的槽函数上,onSocketReadyRead是我们自定义的一个槽,该槽函数功能如下所示;
// 读取收到的数据报 void MainWindow::onSocketReadyRead() { while(udpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize()); QHostAddress peerAddr; quint16 peerPort; udpSocket->readDatagram(datagram.data(),datagram.size(),&peerAddr,&peerPort); QString str=datagram.data(); QString peer="[消息来自 " + peerAddr.toString()+":"+QString::number(peerPort)+"] | "; ui->plainTextEdit->appendPlainText(peer+str); } }首先在代码中调用pendingDatagramSize函数,pendingDatagramSize() 是 QUdpSocket 类的一个成员函数,用于获取下一个待读取的数据报的大小。它的函数原型如下:
qint64 QUdpSocket::pendingDatagramSize() const该函数返回一个 qint64 类型的值,表示下一个待读取的数据报的大小(以字节为单位)。如果没有待读取的数据报,或者发生了错误,该函数将返回 -1。
qint64 QUdpSocket::readDatagram(char * data, qint64 maxSize, QHostAddress * address = nullptr, quint16 * port = nullptr)该函数用于读取数据报并将其存储到指定的缓冲区 data 中,最多读取 maxSize 个字节的数据。可选参数 address 和 port 用于返回数据报的源地址和端口号。如果不需要这些信息,可以将它们设置为 nullptr。函数返回实际读取的字节数,如果发生错误,返回 -1。要查看错误信息,可以使用 error() 和 errorString() 函数。
QByteArray QUdpSocket::readDatagram(qint64 maxSize, QHostAddress * address = nullptr, quint16 * port = nullptr)这个重载函数直接返回一个 QByteArray 对象,其中包含了读取的数据报。
void MainWindow::on_pushButton_clicked() { QHostAddress targetAddr(ui->lineEdit_addr->text()); QString portString = ui->lineEdit_port->text(); quint16 targetPort = portString.toUShort(); QString msg=ui->lineEdit_msg->text(); QByteArray str=msg.toUtf8(); // 发送数据报 udpSocket->writeDatagram(str,targetAddr,targetPort); ui->plainTextEdit->appendPlainText("[单播消息] | " + msg); }广播(Broadcast)
void MainWindow::on_pushButton_2_clicked() { // 广播地址 QString portString = ui->lineEdit_port->text(); quint16 targetPort = portString.toUShort(); QString msg=ui->lineEdit_msg->text(); QByteArray str=msg.toUtf8(); udpSocket->writeDatagram(str,QHostAddress::Broadcast,targetPort); ui->plainTextEdit->appendPlainText("[广播消息] | " + msg); }
读者可自行运行两次客户端,此时的端口将会随机分配,当指定对端端口后就可以向其发送数据,如下图所示: