Qt网络编程 服务器异常断开,不能检查到网络状态变化

Qt网络编程 服务器异常断开,不能检查到网络状态变化,第1张

自己做心跳保活。因为异常断开不属于qt的处理范围,而tcp协议栈又不存在自动处理异常断线的功能,tcp连接在不正常关闭情况下通常都会被协议栈保持存活一段时间(具体和操作系统协议栈实现和设置有关)。qt无法获得tcp协议栈的状态消息,也就不会做出任何反应。所谓心跳机制请参照以下网址内容:

http://baike.baidu.com/view/4372209.htm

项目使用qwebsocket。没想到发现一个大bug。客户端建立5000连接同时发送心跳包给服务器,然后频繁会有连接断开。服务器找到原因,QWebsocket的数据帧的mask值(大概是个十六进制的东西)错误,这个东西的最高位必须不能为0才可以,硬性规定,否则服务器会强制关闭这个连接。导致客户端收到“远程服务器连接断开”的error。解决方法:QT的QWebsocket有个接口,叫做setMaskGenerator,可以设置mask生成器,具体如下:CMaskGenerator * m_mask = new CMaskGenerator();QWebSocket* qwskt= new QWebSocket()qwskt->setMaskGenerator(m_mask)CMaskGenerator 类:class CMaskGenerator : public QMaskGenerator{Q_DISABLE_COPY(CMaskGenerator)public:CMaskGenerator(QObject *parent = Q_NULLPTR) :QMaskGenerator(parent){}virtual quint32 nextMask(){quint32 val = quint32((double(qrand()) / RAND_MAX) * std::numeric_limits<quint32>::max())while (val == 0){seed()val = quint32((double(qrand()) / RAND_MAX) * std::numeric_limits<quint32>::max())}return val}virtual bool seed(){qsrand(QDateTime::currentDateTime().toTime_t())return true}private:}亲测此问题解决了,代码不必修改,直接可以用。quint32((double(qrand()) / RAND_MAX) * std::numeric_limits<quint32>::max())是Qt原本的随机规则,它不为0就没有问题,但我不知此值的具体要求(上限等等),所以只能沿用Qt的这个随机规则,用循环保证它不为0

出现同样的情况,说明电脑中了病毒。QT语音因为长时间的使用可能会出现问题,不妨重新下载一个,也可以换一个别的软件。如果问题依旧,就很有可能是电脑出现了问题,打开一个电脑里的别的软件,开启杀毒软件,扫描全盘,等待扫描结束,查杀病毒。

基本说明:

1、QT助手任务,专注于任务分发,资源对接,QT助手任务是基于语音/文字/图片/远程/视频等为一体的在线任务对接平台,致力于保证资源双方的资金安全,语聊大厅是公会会员聊天/吹水的地方,本模块支持语音聊天,文字聊天,图片聊天等;

2、发单管理,是发单需求方发布任务和管理已发任务的地方,其功能包括,已发布任务,进行中的任务,已完成的任务,发布新任务和任务模版管理;接单大厅中,会员可以看到符合自己需求的任务,不符合的任务,将会自动过滤,接单方根本就看不到。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/516666.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-20
下一篇2023-06-20

发表评论

登录后才能评论

评论列表(0条)

    保存