UDP入门学习II

目标:实现一个界面发送,另一个界面接收
参考:yafeilinux
目标界面:
发送界面
接收界面
思路:

  1. 发送界面
    首先,在头文件里面声明一个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.

  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,衷心感谢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章