Qt网络编程之二-阿里云开发者社区

开发者社区> maojunxu> 正文

Qt网络编程之二

简介: 使用QUdpSocket进行UDP编程        UDP(用户数据报协议)是一个轻量级的,不可靠的,面向数据报的,无连接协议。
+关注继续查看
使用QUdpSocket进行UDP编程


       UDP(用户数据报协议)是一个轻量级的,不可靠的,面向数据报的,无连接协议。当可靠性不是很重要的时候就可以使用该协议。例如:一个用于报告时间的服务器可以使用UDP。如果包含时间的数据报丢失了,那么客户端只需发出另外一个请求。
       QUdpSocket类允许你发送和接收UDP数据报。它继承自QAbstractSocket,因此它有共享了QTcpSocket的大多数接口。最主要的不同就是QUdpSocket以数据报的形式发送数据,而不像QTcpSocket使用连续的数据流。简言之,一个数据报就是一个有大小限制数据包(通常小于512bytes),包含发送方的IP地址和端口号、接收方的IP地址和端口号以及要传输的数据。
       QUdpSocket支持IPv4广播。广播通常是用于实现网络发现协议,例如寻找网络上拥有最大空余磁盘空间的主机。一个主机发出的数据报,网络上的其它主机都可以接收到。每一个主机都接收到一个请求,然后返回一个应答信息给发送者,表明当前可用磁盘空间。发广播的主机直到接收到所有其它主机的应答信息才从中选择可用磁盘空间最大的主机来存储数据。要广播一个数据报,仅仅只需要将该数据报发送给特殊的地址:QHostAddress::Broadcast (255.255.255.255),或者是你本地网络的广播地址。
       QUdpSocket::bind()创建用于接收进入的数据报,这个和TCP服务器的 QTcpServer::listen()十分相似。无论什么时候当一个或者多个数据报到达时,QUdpSocket就会发送readyRead()信号。调用QUdpSocket::readDatagram()来读取数据报。
       Broadcast Sender 和 Broadcast Receiver示例展示了如何使用Qt编写UDP发送者和UDP接收者。

       QUdpSocket同样支持多播。Multicast Sender 和 Multicast Receiver示例展示了如何编写UDP多播客户端。



使用QHostInfo解析主机名称
       在建立网络连接之前,QTcpSocket和QUdpSocket进行一个名称查询,将你连接的主机的名称翻译为一个IP地址。这个操作通常都是使用DNS(域名服务)协议。
       QHostInfo提供了一个静态的方法,使得你可以自己完成这个查询操作。提供使用一个主机名、一个QObject指针和一个槽函数作为参数调用QHostInfo::lookupHost(),QHostInfo将会执行名称查询,并且在查询结束的时候调用已经指定的槽函数。实际的查询操作将会在一个单独的线程中完成,利用操作系统自己的方法进行名称查询操作。
       QHostInfo也提供了一个称为QHostInfo::fromName()的静态方法,该方法将主机名作为参数和返回的结果。在这种情况下,查询操作与函数调用者在一个线程中完成。这个重载对于非GUI应用或将查询操作放在一个单独的,非GUI的线程中是十分有用的。(在一个GUI线程中调用这个函数可能会在它执行查询操作的时候导致你的UI冻结。)


支持网络代理
       使用Qt进行网络通信可以通过代理完成,也就是在本地和远程的连接中指向或者过滤网络路径。
       单个的代理是由QNetworkProxy类呈现的,该类用来描述和配置到代理的接连。不同层次的网络通信代理类型都得到了支持,由于SOCKS 5的支持,使得允许在一个低层次的网络流量使用代理,HTTP和FTP代理工作在协议层次。查看QNetworkProxy::ProxyType获取更多的信息。
       代理可以在一个应用程序的单个套接字或者全部网络通信上使能。一个新打开的套接字在它被连接之前可以通过调用QAbstractSocket::setProxy()函数来使用代理。应用程序范围的代理可以通过调用QNetworkProxy::setApplicationProxy()函数对所有的套接字连接使能的。
       代理工厂主要用于创建代理使用的策略。QNetworkProxyFactory是通过基于查询具体代理类型来支持代理的。 查询本身是使用QNetworkProxyQuery对象来编码的,该对象以基于关键的标准来选择使能的代理,,例如,代理的目的(TCP,UDP连接,TCP服务器,URL请求),本地的端口,远程主机和端口,使用的协议(HTTP,FTP等)。
QNetworkProxyFactory::proxyForQuery()被用来直接的查询工厂。一个应用程序范围的代理的策略可以通过传递一个factory给QNetworkProxyFactory::setApplicationProxyFactory()来实现,并且自定义的程序级代理策略可以通过创建QNetworkProxyFactor的子类实现,查看相应的类文档获取详细信息。


Bearer Management支持
       Bearer Management控制着设备的连接状态,例如:应用程序可以启动和停止网络接口,并且在接入点之间透明的漫游。
       QNetworkConfigurationManager类管理者设备所知的一系列网络配置。一个网络配置描述了启动网络接口的参数集合,并且使用QNetworkConfiguration类代表。
       一个网络接口通过给定的网络配置打开一个QNetworkSession来完成启动。大多数情况下,基于特定平台默认的网络配置创建网络会话是合适的。默认的网络配置是函数QNetworkConfigurationManager::defaultConfiguration()返回的。
       在一些平台上,平台要求应用程序在进行任何网络操作之前打开一个网络会话。这个可以通过
QNetworkConfigurationManager::capabilities()函数返回QNetworkConfigurationManager::NetworkSessionRequired
的值来测试。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
从ACL 2020看知识图谱研究进展
本文选择了 ACL 2020 中三篇与知识图谱相关的文章进行详细解读。
3 0
[iOS研习记]——聊聊野指针与僵尸对象定位
在iOS项目开发中,或多或少的我们都会遇到一些Crash的情况,大部分Crash抛出的异常都是NSException层的,这类异常是OC层代码问题造成的,通常堆栈信息和异常的提示信息都非常明确,可以直接定位到出问题的代码,从而使这类问题的解决并不困难。可以引起Crash的异常除了NSException外,还有Unix层和Mach层的异常。
3 0
Fiddler 抓包配置iphone为例
Fiddler 抓包配置iphone为例
3 0
华为云到底用AI做了什么?从少坐一趟机场摆渡车谈起
「Everyone’s talking about AI. Huawei is making it happen.」
4 0
使用ABAP批量下载有道云笔记中的图片
使用ABAP批量下载有道云笔记中的图片
3 0
HTML5应用 + Cordova = 平台相关的混合应用
HTML5应用 + Cordova = 平台相关的混合应用
5 0
区块链之旅(一)
p2p:peer to peer,简称p2p,就是点对点的意思。处于p2p中的网络中的所有节点地位都是相等的,网络不依赖一个中心。
4 0
除了bug,GitHub可能还把你的女装照冻到了北极,1000年后还能读那种
对于程序员来说,一生中最骄傲 / 耻辱的事可能在于:人没了,代码还在。
3 0
Golang String字符串类型转Json格式
go的string字符串格式转json格式 确实有点麻烦,如果不知道json里面的类型好像就构建不了结构体了。
4 0
通过90行代码学会HTML5 WebSQL的4种基本操作
通过90行代码学会HTML5 WebSQL的4种基本操作
6 0
+关注
467
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载