基于QT4的TCP/UDP客户端程序设计_qt4 tcp-程序员宅基地

技术标签: QTCP/IP  Qt Creator  

文章转自: http://blog.sina.com.cn/s/blog_705adafb0101g00d.html
设计一个基于QT的客户端程序,该程序使用tcp和udp与服务器端通讯,应用层协议为iec103协议,客户端与服务器端建立tcp连接,交互通讯流程采用tcp方式,定时报文传输采用udp方式,本客户端处理tcp和udp通讯,对应用层数据报文解析后提供回调接口供应用使用,并提供接口供应用传入交互命令或非交互数据,服务器端的交互回复也采用回调函数的形式提供给应用。本客户端不建立线程,为命令或报文驱动方式运行。本客户端不包含任何图形界面的内容,仅处理tcp和udp通讯并解释应用协议,结果供应用使用。
1 网络通讯关键知识点
tcp通讯是基于连接的端到端数据传输的通讯,其和UDP通讯的区别是:TCP通讯需要建立连接,而UDP通讯不需要建立连接,TCP通讯的数据有重发机制,而UDP没有,所以TCP通讯比UDP通讯可靠。TCP通讯程序流程如下:
TCP客户端:
创建TCP socket --> 连接服务器connect,建立连接 —> 收数据:read socket,发数据 write socket。
TCP服务器端:
创建TCP socket --> 侦听listen 等待连接 --> 有连接时确认连接accept --> 收数据:read socket,发数据 write socket.。
当一方需要主动关闭连接时调用close来关闭连接。建立连接后通讯过程中,一方调用接口read、write时返回错误时,则表明连接异常,应调用close,客户端重新连接服务器connect。
UDP通讯是非连接的,没有客户端和服务器端的区分,A发送数据给B,数据报文发送出去后,B有没有收到,A不知道,因此数据的可靠传输需要应用层协议来弥补。UDP通讯程序流程如下:
创建UDP socket --> 收数据:read socket,发数据 write socket
2 QT4.8网络通讯类介绍
QT4.8的QtNetWork的模块提供用于网络通讯基本的类,用于TCP客户端通讯的有QTcpSocket类,用于TCP服务器端通讯的有QTcpServer类,用于UDP通讯的有QUdpSocket类。本客户端程序中使用到QTcpSocket和QUdpSocket类,下面介绍一下QTcpSocket、QUdpSocket以及QTcpServer的成员。
QTcpSocket:
enum NetworkLayerProtocol:网络层协议枚举,可取值为:
QAbstractSocket::IPv4Protocol,值为0,IPv4协议
QAbstractSocket::IPv6Protocol,值为1,IPv6协议
QAbstractSocket::UnkownNetworkLayerProtocol,值为01,非IPv4和IPv6协议
flags OpenMode:socket的打开模式,有open函数的入参设定,其取值为:
QIODevice::NotOpen,值0x0000,设备为打开
QIODevice::ReadOnly,值0x0001,只读方式打开
QIODevice::WriteOnly,值为0x0002,只写方式打开
QIODevice::ReadWrite,值为ReadOnly|WriteOnly,读写方式打开
QIODevice::Apend,值为0x0004,追加写方式打开
QIODevice::Truncate,值为0x0008,截头方式打开,即打开设备之前丢掉之前的数据
QIODevice::Text,值0x0010,读设备的时候,行结束字符转换为‘\n’,写的时候把行结束字符转换为本地的行结束字符。
QIODevice::Unbufferd,值0x0020,不缓存数据。
enum SocketError:socket返回的错误信息枚举:
QAbstractSocket::ConnectionRefusedError 0 连接被对方拒绝或超时
QAbstractSocket::RemoteHostClosedError 1 远程主机关闭了连接,远程主机发送主动关闭socket给客户端时,客户端应关闭socket
QAbstractSocket::HostNotFoundError 2 主机地址错误
QAbstractSocket::SocketAccessError 3 应用程序无权操作
QAbstractSocket::SocketResourceError 4 本地系统资源不够(比如socket太多)
QAbstractSocket::SocketTimeoutError 5 socket超时
QAbstractSocket::DatagramTooLargeError 6 数据报大于操作系统的限制
QAbstractSocket::NetworkError 7 网络错误,比如网线拔出
QAbstractSocket::AddressInUseError 8 绑定的IP地址已被使用
QAbstractSocket::SocketAddressNotAvailableError 9 绑定的IP地址不是主机的地址
QAbstractSocket::UnsupportedSocketOperationError 10 本地系统不支持该socket操作
QAbstractSocket::ProxyAuthenticationRequiredError 12 socket使用代理,该代理需要认证
QAbstractSocket::SslHandshakeFailedError 13 SSL/TLS 握手失败,连接将被关闭 (仅在使用QSslSocket时)
QAbstractSocket::UnfinishedSocketOperationError 11 仅QAbstractSocketEngine使用,上一次的socket操作未完成
QAbstractSocket::ProxyConnectionRefusedError 14 连接代理服务器被拒绝,无法连接到代理服务器
QAbstractSocket::ProxyConnectionClosedError 15 对代理服务器的连接被意外关闭
QAbstractSocket::ProxyConnectionTimeoutError 16 连接代理服务器超时,可能是代理服务器停止提供服务
QAbstractSocket::ProxyNotFoundError 17 代理服务器为找到
QAbstractSocket::ProxyProtocolError 18 连接协商与代理服务器,因为从代理服务器的响应无法理解。
QAbstractSocket::UnknownSocketError -1 未定义错 enum SocketOption:socket可以设置的属性的选项,如果需要他们可以在收到一个connected()信号或从QTcpServer接收到一个新的socket后设置。
常量 值 描述
QAbstractSocket::LowDelayOption 0 优化socket达到低延迟时间.对于QTcpSocket,该设定将设定TCP_NODELAY选项同时禁止Nagle’s 算法.设定为1使能.
QAbstractSocket::KeepAliveOption 1 该选项设定为1将使能socket的SO_KEEPALIVE选项
QAbstractSocket::MulticastTtlOption 2 将该项设定一个整数,将设定IP_MULTICAST_TTL (TTL for multicast datagrams) socket选项.
QAbstractSocket::MulticastLoopbackOption 3 该项设定为1,将使能 IP_MULTICAST_LOOP (multicast loopback) socket 选项. enum SockState:socket的状态,值为:
常亮 值 描述
QAbstractSocket::UnconnectedState 0 socket未连接.
QAbstractSocket::HostLookupState 1 socket正在执行主机名查找
QAbstractSocket::ConnectingState 2 socket一开始建立一个连接
QAbstractSocket::ConnectedState 3 连接已建立
QAbstractSocket::BoundState 4 socket已绑定IP地址和端口(服务器端)
QAbstractSocket::ClosingState 6 socket终止等待关闭(data may still be waiting to be written).
QAbstractSocket::ListeningState 5 侦听状态. enum SocketType:描述传输层的协议:
常量 值 描述
QAbstractSocket::TcpSocket 0 TCP
QAbstractSocket::UdpSocket 1 UDP
QAbstractSocket::UnknownSocketType -1 Other than TCP and UDP QTcpSocket(QObject* parent=0):构造函数,入参为父QObject的指针,传入this指针。
~QTcpSocket():析构函数。
abort():终止当前的连接并复位socket。和disconnectFromHost()不同,该函数立即关闭socket,丢弃所有写缓冲挂起的数据。
aboutToClose():是信号函数,当设备退出将关闭时该信号发出来,connect这个信号可以出发操作,在设备关闭之前来做一些处理(比如独立缓冲的数据需要写到设备里去)。
atEnd():当前无数据则返回true,否则返回false。
blockSignals(bool block):如果block为true,该对象发送的信号阻塞。发送信号将不调用任何连接到该信号的函数,如果block为false,非阻塞。destroyd()信号不受该函数设置的影响。
bytesAvailable():返回缓冲中接收到的等待读取的数据字节个数。
bytesToWrite():返回等待写的数据字节个数。控制返回到事件循环或flush()调用时这些数据字节写入。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wml00876/article/details/98748596

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法