闽公网安备 35020302035485号
| 函数 | 描述 |
|---|---|
| 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);
}
读者可自行运行两次客户端,此时的端口将会随机分配,当指定对端端口后就可以向其发送数据,如下图所示: