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

智能推荐

转载——Linux 汇编语言开发指南_linux 汇编 调用 wire-程序员宅基地

文章浏览阅读558次。转载地址:http://www.ibm.com/developerworks/cn/linux/l-assembly/_linux 汇编 调用 wire

Java手写单例之饿汉式、懒汉式、双重判定锁。_1、手写单例(懒汉、饿汉、双锁安全全部写一遍)-程序员宅基地

文章浏览阅读959次。Java手写单例之饿汉式、懒汉式、双重判定锁。package org.fh.action;/** * 饿汉式 * @author Administrator * */public class Singleton { /** * 私有的 final 修饰的变量 不能被二次赋值 */ private static final Singleton singleton = n..._1、手写单例(懒汉、饿汉、双锁安全全部写一遍)

ace--5.设置首页访问_ace访问-程序员宅基地

文章浏览阅读144次。1 基本结构 2 操作2.1 Web.xml 2.2 Index.jsp 方正管理系统 window.open('${path}/index.do','_parent'); 2.3 PageController@Controllerpublic c_ace访问

TortoiseGit解决冲突-程序员宅基地

文章浏览阅读1w次,点赞12次,收藏52次。TortoiseGit解决冲突问题概述场景重现解决冲突问题概述在项目实施过程中,多人维护同一份文件或代码时经常会在本地Commit完再从远程仓库Pull时出现冲突。这时需要保留自己的内容,同时也保留远程仓库原来的数据信息。场景重现新建test仓库,仓库中新建文本文档,在其中输入内容123。在PC上两个不同的地方分别克隆test仓库,以此来模拟两个不同的维护人员。接下来模拟冲突产生过程:在test1文件夹中的文档中新增内容“1111111”,右击->Commit,之后右击->_tortoisegit解决冲突

Notepad++设置文件默认语言和关键字高亮显示_notepad语言abaqus关键词-程序员宅基地

文章浏览阅读9.4k次,点赞4次,收藏8次。1、【设置】–>【语言格式设置】2、左侧【语言】框中选择文本语言(此处以SQL为例)3、在【自定义扩展名】中添加文件格式(多个格式之间用空格分隔)此处添加的两种文件格式为hql和txt,保存之后,下次使用Notepad++打开.sql .hql .txt文件时将默认使用SQL语言,同理可按需求设置其他文件格式4、自定义高亮显示关键字(多个关键字用空格分隔)在Notep..._notepad语言abaqus关键词

微信小程序_js 延时 微信小程序-程序员宅基地

文章浏览阅读264次。微信小程序 一般组件的方法只能通过点击事件触发 如果想要它自己调取可以通过下面的方法ready(){//自带的方法 ready 返回一个结果 this.getbanner() }..._js 延时 微信小程序

随便推点

sysbench工具测试达梦数据库_stmt handle to the limit the number of statements -程序员宅基地

文章浏览阅读3.4k次。1、简单介绍 sysbench是一个开源,模块化的多线程性能测试工具,可以用来进行硬件环境性能测试,也可进行数据库的性能测试。但是由于需要支持DM测试,所以我们一般使用源码进行编译。2、运行方法 sysbench通过运行lua脚本进行数据库测试。而每次测试都分为prepare、run、cleanup这三个步骤,分别对应数据准备,运行测试,数据清理。每一次测试都是一个闭环,必须严格按照这三步来进行操作,不然会报错。 使用sysbench源码进行编译测试时,由..._stmt handle to the limit the number of statements or system of memory

当我们在谈SWIFT时,到底在谈什么?_swift作为进口商有什么顾虑-程序员宅基地

文章浏览阅读4.7k次。胜利往往伴随着放弃不切实际的幻想。当地时间2月26日,美国、英国、欧盟与加拿大发表共同声明,宣布将俄罗斯主要银行从SWIFT体系中剔除。SWIFT凭借着其强大的制裁效果,在民间一直有着金融核武器之称,因此这一劲爆消息引发了全网的热议,不少人认为此举将对于俄罗斯经济产生巨大影响;也有人认为,我国也要对此未雨绸缪,加强跨境人民币系统CIPS系统的建设;而最乐观的看法是SWIFT是一把伤敌一千自损八百的双刃剑,美国一旦把SWIFT的牌打出来,那么也就意味着美元的金融霸权即将走向终结。个SWIFT到.._swift作为进口商有什么顾虑

大唐公务员唐僧向李世民汇报工作,堪称国际最高水平-程序员宅基地

文章浏览阅读108次。唐僧呈交给唐太宗的这份取经报告,绝对是前无古人,后无来者,世界一流水平。对于现代公务员写公文而言,的确有值得学习借鉴的高深之处!尊敬的唐太宗陛下:我叫唐三藏,又名唐僧。为弘扬佛法,普度众生,超度亡魂。根据《公元627年大唐工作安排》(唐发[627]1号)的精神,成立唐三藏取经办公室,奉命到西天拜佛求经。取经办公室师徒4人历时14年,行程十万八千里,经历九九八十一难,终于取得了我佛大乘真经,圆满地完..._唐僧的工作报告,堪称史上最牛

C/C++基础知识总结——数据的共享与保护-程序员宅基地

文章浏览阅读109次。1. 标识符的作用域与可见性  1.1 作用域    标识符的作用域包括:函数原型作用域、局部作用域、类作用域、命名空间作用域  (1) 函数原型作用域:函数的参与的作用域就是从函数的开始到结束  (2) 局部作用域:void fun(int a){ int b = a; cin>>b; if(b>0) ..._c++数据的共享和保护实验总结

无法解析的外部符号 _cublascreate_v2@4,等一系列的类似问题(用于x64位。)以及vs2013+cuda8.0+win10配置过程_cuda程序报错无法解析的外部符号cublascreate_v2,该函数在main函数中被引用-程序员宅基地

文章浏览阅读9.4k次,点赞13次,收藏35次。首先贴出我的问题,解决的就是这个问题。要解决这个问题,首先要看你的cuda环境配置的是否正确,那么就要从头跟着我们走一遍,再检查一下您配置的是否正确。1>1.cu.obj : error LNK2019: 无法解析的外部符号 cublasDestroy_v2,该符号在函数 main 中被引用1>1.cu.obj : error LNK2019: 无法解析的外部符号 cudaFree,该..._cuda程序报错无法解析的外部符号cublascreate_v2,该函数在main函数中被引用

appium+python开发09--框架封装,作用yaml作数据驱动_from appium.webdriver.webdriver import webdriver用法-程序员宅基地

文章浏览阅读1.3k次。雪球APP:实现股票查询:(Search)股票选择:(Selected)登陆操作的封装:Profilepage页面登陆页面目录结构:AndroidClient.py主要实现app的安装的启动功能:from appium import webdriverfrom appium.webdriver.webdriver i..._from appium.webdriver.webdriver import webdriver用法

推荐文章

热门文章

相关标签