• 805阅读
  • 4回复

[提问]QT tcp 崩溃 [复制链接]

上一主题 下一主题
离线介农酥
 

只看楼主 倒序阅读 楼主  发表于: 2023-04-16
回复本帖可获得20RMB金钱奖励!
每人最多可获奖1次,奖池剩余20RMB金钱 (中奖几率80%)

Qt:服务器端
TCP/IP助手:客户端

1)服务器端开始监听QTcpServer::Listen()
2)客户端连接服务器端
3)关闭服务器端QTcpServer::close()
4)服务器端又重新监听QTcpServer::Listen()
4)关闭客户端(实际上已经断了,至少助手没有显示关闭,所以必须先点击,再点击),又连接服务端
5)服务端崩溃,崩溃的地方在

qint64 QIODevice::write(const QByteArray &data)
{
    Q_D(QIODevice);  //这句崩了

    // Keep the chunk pointer for further processing in
    // QIODevicePrivate::write(). To reduce fragmentation,
    // the chunk size must be sufficiently large.
    if (data.size() >= QRINGBUFFER_CHUNKSIZE)
        d->currentWriteChunk = &data;

    const qint64 ret = write(data.constData(), data.size());

    d->currentWriteChunk = nullptr;
    return ret;
}
离线liudianwu

只看该作者 1楼 发表于: 2023-04-17
回帖奖励+ 20
QTcpServer::close()仅仅是关闭监听,但是你的之前的连接都在的,你需要先关闭连接再close监听。否则没用的。
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线介农酥

只看该作者 2楼 发表于: 2023-04-18
回 liudianwu 的帖子
liudianwu:QTcpServer::close()仅仅是关闭监听,但是你的之前的连接都在的,你需要先关闭连接再close监听。否则没用的。 (2023-04-17 17:38) 

非常感谢,我关闭服务器,顺便关了连接的socket,tcp/ip助手这边确实显示关闭了(之前显示连接的状态),但是服务器再次开起来,tcp/ip助手连接,还是崩了,错误的地方还是一样的。
离线spygg

只看该作者 3楼 发表于: 2023-04-18
回帖奖励+ 20
tcpserver 在退出的时候最好显式销毁, 也就是不要用 deletelater 或者利用父对象自动回收特性删除, 直接delete 试试
签名就是这么浪
离线介农酥

只看该作者 4楼 发表于: 2023-04-18
回 spygg 的帖子
spygg:tcpserver 在退出的时候最好显式销毁, 也就是不要用 deletelater 或者利用父对象自动回收特性删除, 直接delete 试试 (2023-04-18 16:29) 

我没有delete,tcpserver也没有定义成指针,只是单纯的关闭。
快速回复
限100 字节
 
上一个 下一个