Qt5 UDP开发

来源:互联网 发布:网络安全法考试单选 编辑:程序博客网 时间:2024/05/20 18:41

最近在学习qt下socket开发,今天先学习了一下qt下udp socket的开发。参考了qt5的文档。以及一些其他的参考书。

UDP是指user datagram protocol ,用户数据报协议,是一种轻量级,不可靠的,面向数据报的,非链接的协议。常用在一下对数据可靠性要求不是很重要的程序中。

这个类最常用的方式就是利用bind()函数绑定到某一地址和端口,然后调用 writeDategram()函数和
readDatagram()函数进行数据传输。

如果你想要使用标准的QIODevice函数例如read(),readLine(),write()等,你必须首先利用connectToHost()函数把socket直接连接到通信的另一端。

socket每向网络写入一个数据报就会发射bytesWritten()信号。如果你只是想发送一份数据报,你并不需要调用bind()函数进行绑定。

无论何时有数据报到达时 socket就会发射readyRead()信号。这样的话,hasPendingDatagram()函数会返回true值。然后调用 pendingDatagramSize()函数来获得到达的第一份数据报的字节大小,最后调用readDatagram()函数来读取到达的数据报。

最后要注意的一点是:当收到readyRead()信号时,已到达的数据报都应该被读取,否则,当下一次有数据报到达的时候,readyRead()信号就不会发射了。

下面是QT参考文档上的一个例子:

void server::initSocket(){udpSocket = new QUdpSocket(this);//构建一个udpsocket;udpSocket->bind(QHostAddress::LocalHost,7755);//绑定到本机地址的7755端口//连接readyRead()信号与槽readPendingDatagram()来读取数据报connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readPendingDatagram()));}void server::readPendingDatagram()  //读取数据的槽实现{while(udpSocket->hasPendingDatagram())//只要socket有数据到达,一直循环的读取{QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());//调整datagram的大小与socket收到的数据大小一样QHostAddress sender;//发送者的地址qint64 senderPort;//发送者的端口号udpSocket->readDatagram(datagram.data(),datagram.size(),&sender,&senderPort);//读取数据报processTheDatagram(datagram);//处理读取到的数据报}}
1 0