Qt网络编程:QUdpSocket

本文介绍了如何使用QTcpSocket和QUdpSocket进行TCP和UDP通信。通过示例代码展示了发送和接收数据报、多播消息的过程,同时提到了相关成员函数及其作用。
摘要由CSDN通过智能技术生成

一、描述

TCP服务端。接收传入的 TCP 连接。

二、收发数据报

1、发送数据报

udpSocket = new QUdpSocket(this);

QByteArray datagram = "这是消息内容";
udpSocket->writeDatagram(datagram.data(), datagram.size(),QHostAddress::Broadcast, 45454);

2、接收数据报

udpSocket = new QUdpSocket(this);
udpSocket->bind(45454, QUdpSocket::ShareAddress);//绑定IP地址和端口号
connect(udpSocket, &QIODevice::readyRead,this, &Receiver::processPendingDatagrams);

void Receiver::processPendingDatagrams()
{
while (udpSocket->hasPendingDatagrams())//判断是否有待读取的数据
{
QByteArray datagram;
//设置datagram的大小为待处理的数据报的大小
datagram.resize(udpSocket->pendingDatagramSize());
//接收数据报 存入datagram中
udpSocket->readDatagram(datagram.data(), datagram.size());
statusLabel->setText(tr("接收到的数据: \n\"%1\"").arg(datagram.data()));
}
}

三、收发多播消息

1、发送多播数据报

QHostAddress groupAddress = QHostAddress("239.255.43.21");//本地多播地址 向此地址发消息是向内部网络发消息

udpSocket = new QUdpSocket(this);

udpSocket->setSocketOption(QAbstractSocket::MulticastTtlOption, newTtl);//设置数据报转发最大跳数

QByteArray datagram = "多播消息";

udpSocket->writeDatagram(datagram.data(), datagram.size(), groupAddress, 45454);

2、接收多播数据报

groupAddress = QHostAddress("239.255.43.21");
udpSocket = new QUdpSocket(this);
udpSocket->bind(QHostAddress::AnyIPv4, 45454, QUdpSocket::ShareAddress);
udpSocket->joinMulticastGroup(groupAddress);
connect(udpSocket, &QIODevice::readyRead, this, &Receiver::processPendingDatagrams);

void Receiver::processPendingDatagrams()
{
while (udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
udpSocket->readDatagram(datagram.data(), datagram.size());
qDbug()<<"接收的数据报:<<datagram.data();
}
}

三、成员函数

1、[signal] void acceptError(QAbstractSocket::SocketError socketError)

当接受新连接导致错误时发出此信号。

2、[signal] void newConnection()

每次有新连接可用时都会发出此信号。

3、void close()

关闭服务器。服务器将不再侦听传入连接。

4、QString errorString()

返回最后发生的错误的可读描述。

5、bool hasPendingConnections()

服务器是否有正在连接着的连接。

6、bool isListening()

服务器当前是否正在侦听传入连接。

7、bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

告诉服务器侦听address和port 传入的连接。如果端口为 0,则自动选择一个端口。如果地址是 QHostAddress::Any,则服务器将侦听所有网络接口。

8、int maxPendingConnections()

返的接受的最大连接数量。默认值为 30。

9、QTcpSocket * nextPendingConnection()

将下一个待处理的连接作为已连接的 QTcpSocket 对象返回。如果没有待处理的连接,该函数会返回 nullptr 。

10、void pauseAccepting()

暂停接受新连接。排队的连接将保留在队列中。

11、void resumeAccepting()

恢复接受新连接。

12、QHostAddress serverAddress()

如果服务器正在侦听连接,则返回服务器的地址;否则返回 QHostAddress::Null。

13、quint16 serverPort()

如果服务器正在侦听连接,则返回服务器的端口;否则返回 0。

14、QAbstractSocket::SocketError serverError()

返回最后发生的错误的错误代码。

15、void setMaxPendingConnections(int numConnections)

设置接受的最大连接数量。停止接受新连接,但操作系统可能仍将它们保留在队列中。

16、bool waitForNewConnection(int msec = 0, bool *timedOut = nullptr)

最多等待 msec 毫秒或直到传入连接可用。如果连接可用,则返回 true; 否则返回false。 如果操作超时并且timedOut 不是nullptr,*timedOut 将设置为true。

这是一个阻塞函数调用。 在单线程 GUI 应用程序中不建议使用它,因为整个应用程序将停止响应,直到函数返回。(非阻塞替代方法是连接到 newConnection() 信号。)

如果 msec 为 -1,则此函数不会超时。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

参考:

https://blog.csdn.net/kenfan1647/article/details/118059165

https://blog.csdn.net/kenfan1647/article/details/118059747

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值