• 2691阅读
  • 5回复

tcpsocket readall(),是阻塞的吗?如果不是,如何判断读全了? [复制链接]

上一主题 下一主题
离线hpplel
 

只看楼主 倒序阅读 楼主  发表于: 2018-06-11
write是不是可以写任意字节?
比如发送了20480字节,接受方readall()好像不能读全啊?应该怎么读?

离线dbzhang800

只看该作者 1楼 发表于: 2018-06-11
TCP 传输是数据流,无所谓全与不全

要接受所有你发送的数据,需要靠你自己的协议来判断
离线stlcours

只看该作者 2楼 发表于: 2018-06-11
readall 这一步本身是阻塞的,但数据全不全不一定,你一定要自己继续readall,直到你认为完整了。
离线hpplel

只看该作者 3楼 发表于: 2018-06-13
谢谢楼上的回答!
socket.write(qBytearray)一次好像只能write 65536左右字节吧,readall应该也如此吧
离线songhuirong1

只看该作者 4楼 发表于: 2018-06-14
首先你要读的数据长度你肯定知道,然后调用read(char *, qint64)函数读取数据,这个函数会返回已经读取的字节数。你不断的读取数据,每次读取后把读取到的长度累加起来,直到和你要读的数据长度一样就行了。当然还需要考虑超时问题,比如3s后超时,如果还没有读全认为读取失败了。
离线yanwuyue

只看该作者 5楼 发表于: 2018-06-16
readall不是阻塞的,它会直接返回当前收到的所有数据,
所以你不能write后直接readall,甚至可能什么也收不到,
因为这时候,对方可能还没发送,
需要等待tcpsocket 的信号readyRead触发后在readall
快速回复
限100 字节
 
上一个 下一个