目标:实现一个界面发送,另一个界面接收
参考:yafeilinux
目标界面:
思路:
- 发送界面
首先,在头文件里面声明一个UDP套接字变量和一个按钮槽函数
然后,在构造函数里面定义UDP套接字变量和将按钮槽函数进行手动连接
最后,编写按钮槽函数的实现,要用到writeDatagram()函数来发送报文
void Widget::on_Button_clicked(){
QByteArray datagram = "hello world!";
sender->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45454);
};
注:(1)值得注意的是,这里的地址使用了QHostAddress::Broadcast值,它对应IPv4下的广播地址,如果将该值更换成单机地址(如本机地址QHostAddress::LocalHost或者QHostAddress(“10.21.11.66”)),将变成一个普通的点对点的UDP程序。
(2)对于端口号,它是可以随意指定的,但是一般1024以下的端口号通常属于保留端口号,所以我们最好使用大于1024的端口,最大为65535。我们这里使用了45454这个端口号,一定要注意,在下面要讲的服务器程序中,也要使用相同的端口号。
(3)writeDatagram()函数的原型为qint64 writeDatagram(const char *data,qint64 size,const QHostAddress &address,quint16 port),发送成功返回字节数,失败返回-1.
- 接收界面
第一步与发送界面一致
第二步除了进行UDP套接字的定义和手动连接槽函数之外,还要将接收套接字与端口、IP进行bind
receiver = new QUdpSocket(this);//为变量receiver申请从当前地址开始的一段内存。
receiver->bind(45454, QUdpSocket::ShareAddress);//采用ShareAddress模式(即允许其它的服务连接到相同的地址和端口,特别是用在多客户端监听同一个服务器端口时特别有效)
connect(receiver, SIGNAL(readyRead()), this, SLOT(processPendingDatagram()));//此处的readRead信号表示接收套接字接收到了数据
第三步:编写接收槽函数的实现
void Widget::processPendingDatagram(){
while(receiver->hasPendingDatagrams()) //
{
QByteArray datagram; //
//让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
datagram.resize(receiver->pendingDatagramSize());
//接收数据报,将其存放到datagram中
receiver->readDatagram(datagram.data(),datagram.size());
//将数据报内容显示出来
ui.label->setText(datagram);
}
};
注:/* readDatagram 函数原型
qint64 readDatagram(char *data,qint64 maxSize,QHostAddress *address=0,quint16 *port=0)
部分知识参考:Wuyuan’s Blog,衷心感谢!