前情提要
在之前,我编写了一个系统状态监控软件: starsnode . 但是,最近一段时间,qt客户端在win环境下通通失联掉线了。 软件都是之前打包的,没有修改过任何依赖。并且内网网络是正常联通的(表面如此)。 而且,nodejs客户端在win下正常运行。 于是开始用控制变量法一一排除。
问题:qt客户端,链接 ws://10.0.8.1:6080?token=1234&type=dev&endpointName=jq 卡死,等待
复现环境
在win10 win11 下均出现
出现时间:
去年年底24年到今年25年的某个时候突然出现
qt客户端链接其他服务器对比:
链接ws://124.222.224.186:8800 正常
qt客户端链接本地服务端对比:
依然报错
详细错误码: QAbstractSocket::ConnectionRefusedError
错误描述: "QWebSocketPrivate::processHandshake: Unknown error condition encountered. Aborting connection."
断开连接
nodejs客户端对比
链接 ws://10.0.8.1:6080?token=1234&type=dev&endpointName=jq 正常
nodejs客户端链接本地服务端对比
正常访问
猜测:
### 服务端出现问题
但是nodejs客户端,c++客户端均正常无误
### qt客户端出现问题
但是它链接测试的其他服务器又正常可以链接
### clash代理导致的
比较有可能,因为就是这段时间开始大规模的使用clash
上wireshark验证
qt客户端启动
笑死,根本抓不到任何数据
nodejs客户端启动
正常接收和发送数据
完全退出clash代理
qt客户端正常接收数据
结论:
就是clash拦截了发送给内网地址的数据包
但是为什么nodejs的消息不会被拦截?
似乎是nodejs会默认不使用系统代理,而qt的QNetworkAccessManager 会默认使用系统代理
解决:
qt创建ws客户端时,强制不使用代理
QNetworkProxyFactory::setUseSystemConfiguration(false); // 禁用系统代理
clientSocket->setProxy(QNetworkProxy::NoProxy);