基于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

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签