今天初学udp传输协议,先了解了一下DUP的内容,UDP是一个用户数据报协议,是一个传输层的协议。其传输速度快。但是传输的质量有时不好。
今天我学习了一下udp需要用qt来进行的操作,下面介绍一下我遇到的问题和解决方法
首先我建立了一个qt的项目,发现出现问题,
widget不是类或命名空间,经过排查发现是是因为这个widget应该是自己创建的窗口的名字而不是同意的widget
但是在添加头文件是遇到问题,C1083无法打开包括文件,看了好长时间才发现是因为咱们用UDP所需的头文件
QAbstractSocket没有在pro中添加QT +=network添加之后发现头文件可以找到了。
现在我们开始编写一个简单的收发的小程序
先编写发送的,发送udp的文件比较简单,主要代码是
我自定义了一个按键,这个按键可以进行发送这个操作,一下发送100条helloworld,先用socket实例化一个对象,sender,让它可以发送文件,函数需要这样几个参数,第一个是信息的内容,第二个是我们发送的地址,第三个是我们发送的端口。这样我们就可以把我们想发送的数据发送到我们想要的地方了。
发送程序比较简单,下面我们来编写一下我们的接收程序。
编写接收程序的时候遇到了不少的问题,我们来一一解决
首先我们编写一个接收程序想要完成的是从刚才我们发送的端口把我们发送的数据取出来,然后进行读取。
那么我们就需要一个函数,查资料得知这个函数是bind(),我们使用了一下这个函数,
uSocket.bind(QHostAddress("127.0.0.1"), PORT);
函数中需要的是地址和我们的端口,这样就能把我们需要的数据读取在我们定义的socket上了。
可是我们怎么判断可以读取呢?
一开始我想用一个叫做hsaPendingDatagrams的函数
while(uSocket->hasPendingDatagrams())
这个函数可以判断在这个端口处有没有阻塞的数据,如果有的话就拿出来读。
下面一个问题就是取出来的数据怎么存储了,想了想还是用了
QByteArray ba;
QByteArrary存储。
可是用发送程序发送之后并不能成功的接收到。那么是什么问题呢?
这时候我想了想,就决定编写了一个控制台程序,来验证是哪里出现了问题。
控制台接收程序如下:
头文件
#ifndef UDPRECEIVER_H
#define UDPRECEIVER_H
#include <QObject>
#include <QUdpSocket>
class UdpReceiver : public QObject
{
Q_OBJECT
public:
UdpReceiver(QObject *p = 0);
~UdpReceiver