严格来说,UDP通信没有服务端与客户端的概念,UDP是轻量级、不可靠的网络通信协议,只有信息的发送方和接收方,而且通信双方的角色可变,通信的双方在特定的IP和端口处收发数据,不需要确认。
-
1 点对点通信
关键代码:
- 初始化
{
m_pSocketSender = new QUdpSocket;
m_pSocketReceiver = new QUdpSocket;
m_pSocketReceiver ->bind(QHostAddress(m_sIP),m_Port);
connect(m_pSocketReceiver,SIGNAL(readyRead()),this,SLOT(recvData())); connect(m_pBtnSend,&QPushButton::clicked,this,&UdpWidget::sendData);
}
- 发送数据
void UdpWidget::sendData()
{
QByteArray block;
block.resize(7);
QDateTime time2u = QDateTime::currentDateTime();
block[0] = 0xEB;
block[1] = 0x90;
quint16 hour = time2u.time().hour();
int min = time2u.time().minute();
hour = htons(hour);
min = hton(min);
char* pBuf = block.data();
memcpy(pBuf+2,&hour,2);
memcpy(pBuf+4,((char*)(&min))+1,3);
QHostAddress address(m_sIP);
int len = m_pSocketSender ->writeDatagram(block,address,m_Port);
if(len != 7){
logError("udp send data failed!");
}
else {
logInfoData("udp send",pBuf,7);
}
block.clear();
}
- 接收数据
void UdpWidget::recvData()
{
if(m_pSocketReceiver ->hasPendingDatagrams()){
QByteArray pData;
pData.resize(m_pSocketReceiver ->pendingDatagramSize());
QHostAddress address(m_sIP);
m_pSocketReceiver ->readDatagram(pData.data(),pData.size());
logInfoData("udp recv",pData.data(),pData.size());
}
}
-
2 广播通信
关键代码:
- 初始化
{
m_pSocketSender = new QUdpSocket;
m_pSocketReceiver = new QUdpSocket;
m_pSocketReceiver ->bind(m_Port);
connect(m_pSocketReceiver,SIGNAL(readyRead()),this,SLOT(recvData()));
connect(m_pBtnSend,&QPushButton::clicked,this,&UdpWidget::sendData);
}
- 发送数据
void UdpWidget::sendData()
{
QByteArray block;
block.resize(7);
QDateTime time2u = QDateTime::currentDateTime();
block[0] = 0xEB;
block[1] = 0x90;
quint16 hour = time2u.time().hour();
int min = time2u.time().minute();
hour = htons(hour);
min = hton(min);
char* pBuf = block.data();
memcpy(pBuf+2,&hour,2);
memcpy(pBuf+4,((char*)(&min))+1,3);
int len = m_pSocketSender ->writeDatagram(block,QHostAddress::Broadcast,m_ServerPort);
if(len != 7){
logError("udp send data failed!");
}
else {
logInfoData("udp send",pBuf,7);
}
}
- 接收数据
void UdpWidget::recvData()
{
if(m_pSocketReceiver ->hasPendingDatagrams()){
QByteArray pData;
qint64 size = m_pSocketReceiver ->pendingDatagramSize();
pData.resize(size);
m_pSocketReceiver->readDatagram(pData.data(),pData.size());
size = pData.size();
logInfoData("udp server recv",pData.data(),pData.size());
pData.clear();
}
}