一次解决套接字操作超时错误的过程

本文讲述了作者在Windows客户端使用QTcpSocket连接Ubuntu服务端时遇到的套接字超时问题,通过排查发现是由于端口被占用,最终解决了防火墙设置、端口占用和进程杀除的问题。

作者:朱金灿
来源:clever101的专栏

  在windows客户端使用QTcpSocket连接一个ubuntu服务端程序,出现套接字操作超时的错误。开始感觉还莫名其妙的,因为之前连接都是好好的。首先检查是否是windows防火墙是否限制了应用程序通过。在windows防火墙上都设置允许应用程序通过后,依然出现套接字操作超时的错误。看来问题不是出在windows客户端,而是出在ubuntu服务端。我先判断ubuntu服务端的端口没有开放,先开放一下端口(我所用的端口为6802),运行命令:

# 开放6802端口
sudo ufw allow 6802
# 开启防火墙
sudo ufw enale
# 重启防火墙
sudo ufw reload
# 查看已经开启的端口
sudo ufw status

  开启6802端口后,启动服务端程序又出现一个bind port的错误,原来6802端口被占用了,绑定失败。因此需要查询一下被哪个进程占用了,运行命令:

netstat -ap|grep 6802

查询结果如下:
端口被占用

  可以看到6802端口已经被18645这个进程占用了。现在要把18645这个进程杀死,命令如下:

# 杀死ID为18645的进程
kill -9 18645

  至此问题得到彻底解决。

### 解决 QT 下载安装过程中的套接字超时问题 #### 设置合理的超时参数 在网络通信中,设置合适的超时时间对于防止长时间无响应至关重要。可以通过 `QTcpSocket` 或其他相关类来调整读写操作超时时间。例如: ```cpp QNetworkAccessManager manager; QNetworkRequest request(QUrl("http://example.com/file")); request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); // 设置请求超时时间为30秒 manager.setTransferTimeout(30 * 1000); QNetworkReply* reply = manager.get(request); if (reply->error()) { qDebug() << "Error:" << reply->errorString(); } else { // 处理正常情况下的逻辑... } ``` 上述代码展示了如何利用 `setTransferTimeout()` 方法设定整个传输过程的最大允许持续时间[^1]。 #### 使用非阻塞模式处理长时间任务 为了避免因等待服务器响应而导致应用程序界面冻结的情况发生,建议采用异步方式处理耗时较长的任务。具体做法是在发起 HTTP 请求之前开启新的工作线程,并在线程内完成实际的数据交换流程。这样既能保持主线程流畅运行又可以有效监控并控制各个阶段的时间消耗[^4]。 #### 实施重试机制应对临时性错误 当检测到连接失败或接收不到预期回复时,适当安排几次重新尝试的机会往往能够提高成功的几率。下面给出一段简单的伪代码用于说明这一思路: ```cpp int retryCount = 0; const int maxRetries = 5; while(retryCount++ < maxRetries){ try{ performDownload(); // 执行具体的下载动作 break; // 成功则跳出循环 }catch(const std::exception& e){ qWarning()<<"Failed to download file:"<<e.what()<<", Retrying... ("<<retryCount<<"/"<<maxRetries<<")"; if(retryCount >= maxRetries){ throw std::runtime_error("Max retries exceeded."); } QThread::sleep(2); // 短暂休眠后再试一次 } } ``` 这段代码实现了最多五次的自动重连功能,每次间隔两秒钟再做下一轮测试直至达到最大次数限制为止。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值