一、描述
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