qt4 qtcpsocket write 结束判断

zhenimei100 2017-09-06 04:30:53
我想实现一个功能:就是qtcpsocket调用write函数后,查询是否发送完成,如果未完成,那么认为是qtcpsocket出错了,得重连。然后我用了下面两种方法来判断是否完成:
1、
this->qTcpSocket->write(wirteBuf,size);
if(!this->qTcpSocket->flush())
{
qDebug()<<"writeMsg err need to reconnect.";
this->closedTcpSocket();
}
2、
this->qTcpSocket->write(wirteBuf,size);
if(!this->qTcpSocket->waitForBytesWritten(3000))
{
qDebug()<<"writeMsg err need to reconnect.";
this->closedTcpSocket();
}
结果每次write都打印了writeMsg err need to reconnect.也就是说flush和waitForBytesWritten就是一直是返回false的。
有大神帮忙分析一波吗?
...全文
1462 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhenimei100 2017-09-08
  • 打赏
  • 举报
回复
谢谢大家的回复了,最后我也没能找到判断发送结束的标志。我只能认为,write返回len与我发送长度一致,就认为发送结束了,否则就是write err。 我接着这个帖子再问大家一下,有没有人遇到过,对面close掉socket。但是我并非100%能识别到这种断开,即有时候我识别到了,然后我去重连。有时候没识别到(甚至连SIGNAL(error(QAbstractSocket::SocketError))都没触发),然后我去write的时候,出现段错误了。我是在高频收发的时候出现这种情况的(我这边是6毫秒发送一次,对面是收到就回,然后对面突然close,我不知道对面怎么close的,有时候触发我的disconnect信号,有时候触发error信号,有时候就啥都没触发)。
Lutx 2017-09-07
  • 打赏
  • 举报
回复
个人理解, TCP连接上后是可以一直传递数据的, 至于发送有没有结束, 需要通信双方确定数据格式协议后, 接收方来解析收到的数据, 判断对方所传递的数据是否结束. 比如, 发送方在传递数据的最开始加上本地传递数据的总长度, 然后再发送实际数据, 接收方首先从收到数据中取出数据总长度, 然后将后续的收到的数据放到一个缓存里, 等收到的数据等于开始定义的总长度后, 就认为是发送已结束, 可以将缓存里面的全部数据做后续处理.
zhenimei100 2017-09-07
  • 打赏
  • 举报
回复
谢谢大家的回复,我write之后对面收到了。但是waitForBytesWritten和flush返回false。 真的很怪,我又不想用bytewriten信号。 所以大家有没有方法查询本次发送是否顺利结束?
懒懒的吉他手 2017-09-07
  • 打赏
  • 举报
回复
1.增加超时时间看看,或者直接用默认参数30000ms 2.
SIGNAL(error(QAbstractSocket::SocketError))
看看有没有出错
Little柯南 2017-09-07
  • 打赏
  • 举报
回复
你是TCP,那么端口连接上了么?客户端请求链接,确定链接好了,然后才可以收发
懒懒的吉他手 2017-09-06
  • 打赏
  • 举报
回复
你先确定一下你有没有成功write吧

16,815

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧