基于QT4的TCP/UDP客户端程序设计_qt4 tcpsocket_没用的阿_吉的博客-程序员秘密

技术标签: 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

智能推荐

Burpsuite系列精华总结(1)_burp是否有32位_anansec的博客-程序员秘密

BurpSuite学习之精华总结,从工具的运行起步,到你未曾涉及的领域结束,我不懂得太多,但我可以做知识的搬运工!

MapReduce解决乘用车辆和商用车辆的销售数据分析_用户数据市场分析,统计的车的所有权、型号和类型。_marraybug的博客-程序员秘密

首先还是看下我们的需求 然后拿到我们的数据 可以看到我们的数据里面还有很多空值,是还没清洗的脏数据,一会我们处理的时候需要将其处理掉.一.统计车辆不同用途的数量分布 package hadoop.MapReduce.car.Use; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWr...

Android Toolbox_android toolbox_HelloBirthday的博客-程序员秘密

Platform:Android 7.1SoC:RK3288Android中的"toolbox"命令是一个多功能程序,它将许多常见的Linux命令(以及一些常用的Android命令)的功能封装到一个二进制文件中。Android 7.1.2上toolbox源码位于:system/core/toolboxshell下可通过ls -l xxx来确定某个二进制程序是否链接到toolbox,to...

快速亚像素边缘提取算法_3D-Vision的博客-程序员秘密

快速亚像素边缘提取算法 关键词: Facet模型,曲面拟合,离散切比雪夫正交多项式,亚像素边缘      特色书店,图像处理,机器视觉,C/C++,控制理论/工程,工程数学.....http://shop62151902.taobao.co

2019电赛--无人机题目OpenMV总结_openmv十字拟合_爱学习的果子酱的博客-程序员秘密

2019年电赛,前前后后经历了四天吧。从8月7好开始,到10号结束,浑浑噩噩,不分白昼地为了无人机的题目而努力吧。我的队友负责飞控,我也就负责视觉模块OpenMV程序的编写啦。虽然比赛下来感觉发挥不是特别好,但还是有所收获吧。这里,我把比赛自己用到的相关程序代码贴出来并做了简要总结。无论如何都不能放弃呀!勤做笔记,加油!

python和c 有什么区别_python与c语言的语法有哪些不一样的_weixin_39737240的博客-程序员秘密

Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运...

随便推点

linux安装sox,踩过坑的方法_weixin_30469895的博客-程序员秘密

参考文章 : https://blog.csdn.net/e_zhiwen/article/details/80037476重新在源码中 执行一遍./configure --prefix=$HOME 这个然后在/usr/local/lib 下执行 ldconfig转载于:https://www.cnblogs.com/jzcbest1016/p/11124781.html...

树莓派安装dump1090-fa_hailangnet的博客-程序员秘密

树莓派系统:Raspbian GNU/Linux 10 (buster) litedump1090-fa 依赖于 bladeRF,所以先要安装 bladeRF 才能编译 dump1090-fasudo apt-get install build-essential debhelper librtlsdr-dev pkg-config dh-systemd libncurses5-dev ...

8B/10B编码 转_rgb 8bit转化10bit 算法_starxyl的博客-程序员秘密

8B/10B编码学习原帖见于:http://blog.sina.com.cn/s/blog_3e28c8a50100bq2b.html8B/10B,也叫做8字节/10字节或8B10B。8B/10B方式最初由IBM公司于1983年发明并应用于ESCON(200M互连系统),由Al Widmer和Peter Franaszek在IBM的刊物“研究与开发”上描述。8b/10b编码的特性之一是保证D...

漂亮的提示框源代码_好看的提示框代码_sdsxc的博客-程序员秘密

网页特效-文本特效-漂亮的文字提示效果与之间-->.tableBorder7{width:800;solid;background-color:#000000;}TD{font-family:宋体;font-size:12px;line-height:15px;}th{background-color:#f7f7f7;color:#000000;font-size:12px;font-

LeetCode 22. Generate Parentheses解题报告(python)_parentheses python_orientliu96的博客-程序员秘密

22. Generate ParenthesesGenerate Parentheses python solution题目描述Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.For example, given n = 3, a...

SSL证书pfx格式转为jks_cfca pfx转jks_Himma_DH的博客-程序员秘密

SSL证书pfx格式转为jks首先,从官网下载pfx文件这里以tomcat为例,解压后是如下两个文件(.pfx文件就是证书,.txt则是初始密码)将.pfx文件放入jdk/bin目录下,例如:F:\Java\jdk1.8.0_66\bin,打开电脑命令提示符应用,通过cd命令到F:\Java\jdk1.8.0_66\bin目录下执行命令keytool -importkeystore ...

推荐文章

热门文章

相关标签