(Qtcpsocket)退出程序时提示段错误的解决

这几天使用QT附带的一个example程序fortuneclient,开发了一个tcp通信的小程序,偶然间发现原来的程序存在一个小bug,当填入的ip地址或者端口号错误,关闭程序时,会报段错误,并弹出runtime error出错框。

仔细观察了一下,程序出错时,在QT Creator的application output框里不断的提示
QNativeSocketEngine::write() was not called in QAbstractSocket::ConnectedState

并且错误处理函数displayError,会报两次error,弹出两次出错提示的窗口

然后上网搜了一下,也没有发现明确的解决方法。

 

再仔细单步跟了一下代码,发现代码中存在这样一个问题:

 

 

由于connectToHost函数是一个void型,所以执行完这一步,并不能判断是否真的连到了服务器。我单步执行了一下,发现ip和port填错,程序也会执行到下面的write。没有建好连接,就向socket中写入信息,大概问题就出在这里了。

解决的方法是,将write部分单独做成一个SLOT函数,命名为Login(),然后建立一个信号槽,如下:

当connecttoHost执行成功时,会触发connected信号,然后就会调用Login()函数。这次再试了一下啊,当输入错误ip和port时,程序只会进入displayError一次,并给出相应的提示,也不会执行Login()里的write,再关闭该程序,没有再发生段错误或者runtime error窗口。输入正确的ip和端口号,则能够正确的连接到服务端,并且触发Login()函数

 

参考:http://www.qtcn.org/bbs/read.php?tid=25464

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QTcpSocket 发送数据遇到 TCP 窗口已满(TCP Window Full)的情况,发送方应该停止发送数据,直到接收方回复窗口更新消息。如果长间未收到窗口更新消息,可以尝试在一定的间后重新发送数据,或者关闭当前的 TCP 连接。 如果长间未收到窗口更新消息,可以考虑使用 `QTimer` 类定检查接收方是否已经准备好接收数据,例如: ```cpp void MyTcpSocket::on_error(QAbstractSocket::SocketError error) { if (error == QAbstractSocket::SocketError::SocketTimeoutError) { if (!m_waiting_window_update) { // 如果长间未收到窗口更新消息,则开始等待窗口更新消息 m_waiting_window_update = true; m_window_update_timer.start(5000); // 等待 5 秒钟 } else { // 如果等待间已经超过阈值,则关闭当前的 TCP 连接 close(); } } } void MyTcpSocket::on_readyRead() { // 接收到窗口更新消息后,停止等待并重新发送数据 m_waiting_window_update = false; m_window_update_timer.stop(); // 继续发送数据... } void MyTcpSocket::on_windowUpdateTimeout() { // 如果等待间已经超过阈值,则关闭当前的 TCP 连接 close(); } ``` 在上面的示例代码中,`m_waiting_window_update` 表示当前是否正在等待窗口更新消息,`m_window_update_timer` 是一个定器,用于定检查窗口更新消息是否已经收到。当 `QAbstractSocket::SocketError::SocketTimeoutError` 错误发生,如果当前未在等待窗口更新消息,则开始等待窗口更新消息,并启动定器等待。如果等待间已经超过阈值,则关闭当前的 TCP 连接。当收到窗口更新消息,停止等待并重新发送数据。 需要注意的是,在实际的应用中,需要根据具体情况调整等待间和阈值。另外,如果长间未收到窗口更新消息,也可以尝试调整发送方和接收方的 TCP 缓冲区大小,以提高网络通信的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值