UDP
例子1
.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
#include <QHostAddress>
#include <QHostInfo>
#define BUFFER_SIZE 1024
#define RECV_BUFFER_SIZE 2048
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
QUdpSocket *m_udpSocket;
QByteArray m_recvBuffer;
QByteArray m_dataBuffer;
QHostAddress m_senderIp;
quint16 m_senderPort;
signals:
void dataReceived(QByteArray data);
private slots:
void processPendingDatagrams();
};
#endif
.cpp
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
m_udpSocket=new QUdpSocket(this);
m_udpSocket->bind(QHostAddress("127.0.0.1"),8080);
connect(m_udpSocket,&QUdpSocket::readyRead,this,&Widget::processPendingDatagrams);
}
Widget::~Widget()
{
}
void Widget::processPendingDatagrams()
{
while (m_udpSocket->hasPendingDatagrams())
{
m_recvBuffer.resize(m_udpSocket->pendingDatagramSize());
m_udpSocket->readDatagram(m_recvBuffer.data(),m_recvBuffer.size(),&m_senderIp,&m_senderPort);
m_dataBuffer.append(m_recvBuffer);
while (m_dataBuffer.size()>=BUFFER_SIZE)
{
QByteArray data=m_dataBuffer.left(BUFFER_SIZE);
emit dataReceived(data);
m_dataBuffer.remove(0,BUFFER_SIZE);
}
}
}
例子2
void sendUdpPacket(QString ip,int port,QByteArray data);
void receiveUdpPacket();
void Widget::sendUdpPacket(QString ip,int port,QByteArray data)
{
QUdpSocket socket;
QByteArray packet;
packet.append((char)0x12);
packet.append((char)0x00);
packet.append((char)((data.size()>>8) & 0xFF));
packet.append((char)(data.size() & 0xFF));
packet.append(data);
socket.writeDatagram(packet,QHostAddress(ip),port);
}
void Widget::receiveUdpPacket()
{
QUdpSocket socket;
while (socket.hasPendingDatagrams())
{
QByteArray dataGram;
dataGram.resize(socket.pendingDatagramSize());
QHostAddress senderIP;
quint16 senderPort;
socket.readDatagram(dataGram.data(),dataGram.size(),&senderIP,&senderPort);
static QByteArray cache;
cache.append(dataGram);
while (cache.size()>=4)
{
if ((quint8)cache.at(0)==0x12 && (quint8)cache.at(1)==0x00)
{
quint16 dataSize=((quint8)cache.at(2)<<8)+((quint8)cache.at(3));
if (cache.size()>=4+dataSize)
{
QByteArray data=cache.mid(4,dataSize);
cache=cache.mid(4+dataSize);
}
else
{
break;
}
}
else
{
cache.remove(0,1);
}
}
}
}