前言
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据包协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事
UDP 是User Datagram Protocol的简称, 中文名是用户数据包协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
如需了解UDP与TCP对比,可点击了解UDP和TCP对比。
下面简单介绍下UDP的几种用法。
首先需要在.pro文件中加入
QT +=network
然后需要的头文件
#include <QUdpSocket>
#include <QNetworkDatagram>
单播接收息
m_qudpSocket = new QUdpSocket(this);
m_qudpSocket->bind(QHostAddress::AnyIPv4,8888);//绑定端口号
connect(m_qudpSocket,SIGNAL(readyRead()),this,SLOT(dealReadyRead()));//接收信号槽函数
槽函数接收信号
接收时有两种处理方法
void Widget::readPendingDatagrams()
{
/*法一*/
QUdpSocket *udpSocket = dynamic_cast<QUdpSocket *>(sender());
while (udpSocket->hasPendingDatagrams()) {
QNetworkDatagram datagram = udpSocket->receiveDatagram();
qDebug()<<QString(datagram.data())<<","<<datagram.senderAddress()<<datagram.senderPort();
/*datagram.data() : 是读取的消息内容
*datagram.senderAddress() : 是发送端的ip地址
*datagram.senderPort() : 是发送端端口号
*/
}
/*法二*/
// QUdpSocket *udpSocket = dynamic_cast<QUdpSocket *>(sender());
// while(udpSocket->hasPendingDatagrams()){
// QHostAddress address;
// quint16 port = 0;
// QByteArray datagram;
// datagram.resize(udpSocket->pendingDatagramSize());
// udpSocket->readDatagram(datagram.data(),datagram.size(),&address,&port);
// qDebug()<<QString(datagram.data())<<address.toString()<<port;
// }
单播发送消息
QUdpSocket udpSocket;
QByteArray array = QString("mssage").toLatin1();
//向ip地址为 m_ip 的 发送消息 mssage
udpSocket.writeDatagram(array,array.size(),QHostAddress(m_ip),8888);
组播接收消息
m_qudpSocket = new QUdpSocket(this);
m_qudpSocket->bind(QHostAddress::AnyIPv4,8888,QUdpSocket::ShareAddress);//绑定所有ip来接收组播组信息
m_qudpSocket->joinMulticastGroup(QHostAddress("224.0.0.10")); //加入组播ip:224.0.0.10
connect(m_qudpSocket,SIGNAL(readyRead()),this,SLOT(dealReadyRead()));//接收信号槽函数
接收信息槽函数同单播
组播发消息,也和单播差不多,只是ip地址换成组播地址,加入改组播的都可以收到
QUdpSocket udpSocket;
QByteArray array = QString("mssage").toLatin1();
//向组播地址为 m_groupIp 的 发送消息 mssage
udpSocket.writeDatagram(array,array.size(),QHostAddress(m_groupIp),8888);
广播发消息
关键在于 QHostAddress::Broadcast
QUdpSocket udpSocket;
QByteArray array = QString("#ok").toLatin1();
udpSocket.writeDatagram(array,array.size(),QHostAddress::Broadcast,8888);
获取本机ip地址
//注:需加头文件 #include <QNetworkInterface>
QString myIp;
QList<QHostAddress> AddressList = QNetworkInterface::allAddresses();
foreach(QHostAddress address, AddressList){
if(address.protocol() == QAbstractSocket::IPv4Protocol &&
address != QHostAddress::Null &&
address != QHostAddress::LocalHost){
if (address.toString().contains("127.0.")){
continue;
}
myIp = address.toString();
break;
}
}
qDebug()<<"myIp:"<<myIp;
}