在项目的pro文件中添加:
QT += core gui network
IP端口介绍:任何一个电脑,都可以同时有很多个不同网段的IP地址和端口号;
#include<QHostInfo>
#include<QNetworkInterface>
#include<QUdpSocket>
#include<QByteArray>
int port=5556; 定义端口号
发送端:
QUdpSocket* udpSend=new QUdpSocket;//套接字句柄
//bing绑定IP和端口号,表示指定通过本机的某个IP和端口号发数据(IP本机必须有),如果只是发送数据,没要求指定从本机的那个IP端口发送数据的话,可以不需要bind
udpSend->bind(QHostAddress("192.168.0.34"),port);//本机的IP地址和端口号
//将数据发送出去,参数:数据内容,数据长度,host对方(接收方)IP地址和 port端口
//在Qt中有三种发送数据的方式:
1) qint64 writeDatagram(const QNetworkDatagram &datagram);//QNetworkDatagram 中包含了要发送的数据和IP端口等信息
2)qint64 writeDatagram(const char *data, qint64 len, const QHostAddress &host, quint16 port);
3) qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)
{ return writeDatagram(datagram.constData(), datagram.size(), host, port); }
接收端
udpReceive=new QUdpSocket;
//绑定IP端口,指定从本机的那个IP端口里接受数据(接收端必须bind)
udpReceive->bind(QHostAddress("192.168.0.231"),port);
//连接信号槽,每次有数据报过来,就会触发槽函数
connect(udpReceive,SIGNAL(readyRead()),this,SLOT(dataReceived()));
void Form::dataReceived()
{
udpReceive->hasPendingDatagrams()//判断是否有数据报可读
udpReceive->pendingDatagramSize()//返回收到数据的长度
//接收数据
//用readDatagram函数接收,可以通过参数获取到对方的IP,端口等信息
qint64 readDatagram(char *data, qint64 maxlen, QHostAddress *host = nullptr, quint16 *port = nullptr);
}
报文大小不超过64KB
传输结构体数据
#pragma pack(1)字节对齐
#pragma pack()
处理结构体类型数据
INFO_SCAN info;//接受的数据赋值给结构体
memset(&info,0,sizeof(info));
m_Socket->readDatagram((char*)&info,sizeof(info));
INFO_SCAN info;//将一个结构体的数据发送出去
info.orderType=TELESOFTWARE_CLOSE;
memset(&info.softwareName,0,sizeof(info.softwareName));
QString str=ui->software_name->text();
strcpy(info.softwareName,str.toLatin1());
int n=m_Socket->writeDatagram((char*)&info,sizeof(info),QHostAddress(ui->broadcast_address->text()),PORT);