请教各位Qt QTcpSocket中一次read的字节数和socket缓冲区大小的关系。谢谢

Henryinferno 2016-05-09 10:39:20
我用服务器端发送数据给客户端,客户端调用read函数接收数据。但是每次客户端一次能收到的最大字节数会改变,这个一次read的最大字节数就是socket的接收缓冲区大小吗?还有就是qt应该用什么方法获取socket缓冲区大小?
比如说我服务器发送1200字节数据,可是客户端read一次只能接收1060字节数据。
while(sockClient->bytesAvailable()>0)
{
qDebug()<<"readBufferSize:"<<sockClient->readBufferSize();//结果为什么0?
memset(&msg,0,sizeof(msg));
sockClient->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,1200);//这个没有任何作用
readByte=sockClient->read((char *)(&msg),sizeof(msg));
}
...全文
4206 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Henryinferno 2016-05-11
  • 打赏
  • 举报
回复
引用 6 楼 u010111033 的回复:
发送完跟了个waitForBytesWritten()函数,那么客户端那边是发送完了再做其他处理; 你在服务器里面如果设置一次接收多少字节(最大字节),那么客户端发来数据小于这个字节,一次readyRead就会接受完;客户端发来数据大于这个字节数,那么你会接收多次直至接受完;TCP点对点传输,正常工作下不会出现接收少
谢谢。由于我程序设计的不好导致出现很多问题。我程序实现一个类似qq的基于c/s的聊天,客户端是用qt写的,服务器端没用qt是用的linux系统调用写的。由于我消息是这样定义的: struct msg_t { unsigned char head[4]; char body[256]; ........... }; 客户端一旦接收到数据首先根据head里面的内容判断应该执行什么样的操作。这就限制了我一次必须接收一个完整的数据包。如果我发了1000字节,而一次read只收到900,那么第二次read时的数据就把head覆盖了从而出错。
Little柯南 2016-05-11
  • 打赏
  • 举报
回复
发送完跟了个waitForBytesWritten()函数,那么客户端那边是发送完了再做其他处理; 你在服务器里面如果设置一次接收多少字节(最大字节),那么客户端发来数据小于这个字节,一次readyRead就会接受完;客户端发来数据大于这个字节数,那么你会接收多次直至接受完;TCP点对点传输,正常工作下不会出现接收少
Rampage_SS 2016-05-10
  • 打赏
  • 举报
回复
理解有误啊。朋友、、网络数据传输不是说我1200个字节一下子发送,你就一定是1200个字节一下子都收到的、可能我分包,也可能我不分包。网络任性啊。1060+140=1200,也可以下次我就1000+200。而你所说的read的字节数跟socket缓冲区的大小的理解呢,是没什么问题的。就好比桶里装水。水少我可以倒了,水要一下子放很多只能一下子按桶的最大容积去倒了。
Little柯南 2016-05-10
  • 打赏
  • 举报
回复
if(cmdSocket->bytesAvailable()>0) { nsize = cmdSocket->bytesAvailable(); msg = new char[nsize]; cmdSocket->read(msg,nsize); memcpy(&cmdHeadstart,msg ,nsize); } qDebug("token=%d, cmd=%x,length=%d\n", cmdHeadstart.token,cmdHeadstart.cmd,cmdHeadstart.length); qDebug()<<"收到ack字节数"<<nsize<<endl; nsize就是你要的东东
Henryinferno 2016-05-10
  • 打赏
  • 举报
回复
引用 4 楼 u010111033 的回复:
[quote=引用 3 楼 wsx199397 的回复:] [quote=引用 2 楼 Rampage_SS 的回复:] 理解有误啊。朋友、、网络数据传输不是说我1200个字节一下子发送,你就一定是1200个字节一下子都收到的、可能我分包,也可能我不分包。网络任性啊。1060+140=1200,也可以下次我就1000+200。而你所说的read的字节数跟socket缓冲区的大小的理解呢,是没什么问题的。就好比桶里装水。水少我可以倒了,水要一下子放很多只能一下子按桶的最大容积去倒了。
谢谢哈。那么read函数返回是在什么时候呢?有多个数据包到了或者缓冲区已满?[/quote] tcp里面点对点传输,read函数返回是在接到数据并且按照最大字节数进行读取,此时读到多少就有多少。read的第二个参数就是最大读取的size,至于有多少个包到了,这要看客户端发了多少个包来。因为点对点传输,你发来一个这边接收一个。客户端不发数据,这边不接数据,客户端断线,这边也不接数据了,当然服务器掉线,那客户端就不发数据[/quote] 谢谢。比如说我一共发过来1000字节数据包需要接收,第一次触发readyRead()信号后我调用read接收了900,那么接下来的100字节会再次触发readyRead()信号吗?还是直接read就可以了
Little柯南 2016-05-10
  • 打赏
  • 举报
回复
引用 3 楼 wsx199397 的回复:
[quote=引用 2 楼 Rampage_SS 的回复:] 理解有误啊。朋友、、网络数据传输不是说我1200个字节一下子发送,你就一定是1200个字节一下子都收到的、可能我分包,也可能我不分包。网络任性啊。1060+140=1200,也可以下次我就1000+200。而你所说的read的字节数跟socket缓冲区的大小的理解呢,是没什么问题的。就好比桶里装水。水少我可以倒了,水要一下子放很多只能一下子按桶的最大容积去倒了。
谢谢哈。那么read函数返回是在什么时候呢?有多个数据包到了或者缓冲区已满?[/quote] tcp里面点对点传输,read函数返回是在接到数据并且按照最大字节数进行读取,此时读到多少就有多少。read的第二个参数就是最大读取的size,至于有多少个包到了,这要看客户端发了多少个包来。因为点对点传输,你发来一个这边接收一个。客户端不发数据,这边不接数据,客户端断线,这边也不接数据了,当然服务器掉线,那客户端就不发数据
Henryinferno 2016-05-10
  • 打赏
  • 举报
回复
引用 2 楼 Rampage_SS 的回复:
理解有误啊。朋友、、网络数据传输不是说我1200个字节一下子发送,你就一定是1200个字节一下子都收到的、可能我分包,也可能我不分包。网络任性啊。1060+140=1200,也可以下次我就1000+200。而你所说的read的字节数跟socket缓冲区的大小的理解呢,是没什么问题的。就好比桶里装水。水少我可以倒了,水要一下子放很多只能一下子按桶的最大容积去倒了。
谢谢哈。那么read函数返回是在什么时候呢?有多个数据包到了或者缓冲区已满?

16,235

社区成员

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

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