【关于QT5的问题】QTcpSocket 为什么一次只能读到8192个字节?

shenyi0106 2014-05-20 01:56:01
QTcpSocket 为什么一次只能读到8192个字节?

备注:QT板块人气太差,发了都没人回,所以才来VC板块发一下,看看有没有人搞过QT,并且知道这个问题的。


示例代码如下:

MAX_BUFFER_SIZE = 16K
struct file_head 是一个文件头结构,大小是48个字节

接收端

if (m_client->bytesAvailable() > 0)
{
QByteArray buffer = m_client->read(MAX_BUFFER_SIZE));
//这里的这个buffer总是8192,为什么?
}


发送端

int FileSender::sendFile(QString strFilePath, QString strFileName)
{
//打开文件
QFile file(strFilePath);
if (file.open(QIODevice::ReadOnly) == false)
{
return -1;
}

//分配缓冲区
struct file_head *head = (struct file_head*)malloc(MAX_BUFFER_SIZE);
if (head == NULL)
{
return -1;
}

//获得缓冲区指针
char *pdata = head->data;
int datalen = MAX_BUFFER_SIZE - sizeof(struct file_head);

//设置数据头中不变的部分
memset(head, 0, sizeof(struct file_head));
strcpy(head->filename, strFileName.toLatin1().data());
head->totallen = file.size();

//获取数据
unsigned int len = 0, offset = 0;
while ((len = file.read(pdata, datalen)) > 0)
{
head->offset = offset;
head->datalen = len;
offset += len;
write((char*)head, sizeof(struct file_head) + len);
flush();
waitForBytesWritten();
//通知进度
emit writeChanged(strFilePath, ((double)(head->offset + head->datalen) / head->totallen) * 100);
}
file.close();
free(head);

return 0;
}
...全文
1013 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
不回头的倔强 2016-10-13
  • 打赏
  • 举报
回复
引用 9 楼 sinat_21196493 的回复:
[quote=引用 7 楼 shenyi0106 的回复:]

if (m_client->bytesAvailable() > 8192)
{
    QByteArray buffer = m_client->read(MAX_BUFFER_SIZE));
    //......
}
楼主你好,我的这样改了还是不行,求帮忙。[/quote] 你的好了没,我现在也遇到了这个问题
不回头的倔强 2016-10-11
  • 打赏
  • 举报
回复
引用 7 楼 shenyi0106 的回复:

if (m_client->bytesAvailable() > 8192)
{
    QByteArray buffer = m_client->read(MAX_BUFFER_SIZE));
    //......
}
楼主你好,我的这样改了还是不行,求帮忙。
anda0109 2014-10-15
  • 打赏
  • 举报
回复
enum QAbstractSocket::SocketError QAbstractSocket::DatagramTooLargeError 6 The datagram was larger than the operating system's limit (which can be as low as 8192 bytes).
shenyi0106 2014-06-27
  • 打赏
  • 举报
回复

if (m_client->bytesAvailable() > 8192)
{
    QByteArray buffer = m_client->read(MAX_BUFFER_SIZE));
    //......
}
Monkey_Online 2014-06-26
  • 打赏
  • 举报
回复
楼主你好,请问这个问题怎么解决的啊? 我也遇到了。望答复,感激不尽!~
shenyi0106 2014-05-20
  • 打赏
  • 举报
回复
问题解决了,结贴
shenyi0106 2014-05-20
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
[quote=引用 2 楼 shenyi0106 的回复:] [quote=引用 1 楼 zzz3265 的回复:] 系统给每个socket 有个缓冲大小 默认 你的这个是 8K 最大当然只能读完缓冲的数据, 这个缓冲大小可以用这个修改 setsockopt SO_RCVBUF 修改
答非所问,但是也要感谢之[/quote] ls答案是正确的啊,怎么会答非所问呢,你的使用setsockopt 设置缓冲区块的大小[/quote] 首先,原生QT中不支持这个选项的设置(猜测是不是因为跨平台的缘故) 其次,我通过API调用去设置接收缓冲区大小为64K后,我发送16K,但是我read到的数据却只有8796个字节。 所有,应该有更深层的问题,导致的这个结果,期待更好的答案
worldy 2014-05-20
  • 打赏
  • 举报
回复
引用 2 楼 shenyi0106 的回复:
[quote=引用 1 楼 zzz3265 的回复:] 系统给每个socket 有个缓冲大小 默认 你的这个是 8K 最大当然只能读完缓冲的数据, 这个缓冲大小可以用这个修改 setsockopt SO_RCVBUF 修改
答非所问,但是也要感谢之[/quote] ls答案是正确的啊,怎么会答非所问呢,你的使用setsockopt 设置缓冲区块的大小
shenyi0106 2014-05-20
  • 打赏
  • 举报
回复
引用 1 楼 zzz3265 的回复:
系统给每个socket 有个缓冲大小 默认 你的这个是 8K 最大当然只能读完缓冲的数据, 这个缓冲大小可以用这个修改 setsockopt SO_RCVBUF 修改
答非所问,但是也要感谢之
Yofoo 2014-05-20
  • 打赏
  • 举报
回复
系统给每个socket 有个缓冲大小 默认 你的这个是 8K 最大当然只能读完缓冲的数据, 这个缓冲大小可以用这个修改 setsockopt SO_RCVBUF 修改
内容概要:本文系统研究了构网型变流器的正负序阻抗解耦特性及其在弱电网环境下的稳定性表现,重点依托Matlab/Simulink仿真平台,构建了详细的阻抗数学模型,设计了解耦控制策略,并采用小信号扫频法进行频域辨识与稳定性验证。研究深入探讨了构网型变流器与传统跟网型逆变器在正负序阻抗特性上的本质差异,结合虚拟同步发电机(VSG)等先进控制技术,分析其在抑制宽频带振荡、削弱锁相环动态耦合等方面的优越性。文中不仅提供了完整的仿真模型与MATLAB代码实现,还整合了光伏、风电、储能、微电网等多类新能源系统的阻抗建模与稳定性分析资源,形成了一套面向新型电力系统稳定性的综合性技术资料体系,具有较强的科研复现与工程参考价值。; 适合人群:面向具备电力电子、电力系统自动化、新能源并网等专业背景的研究生、高校教师及工程技术人员,特别适用于从事阻抗建模、小干扰稳定性分析、宽频振荡机理研究以及撰写高水平学术论文的科研工作者。; 使用场景及目标:①掌握构网型变流器正负序阻抗建模与扫频辨识的仿真方法;②深入理解VSG等构网型控制在弱电网中提升稳定性的内在机理;③复现顶刊论文中的阻抗分析流程与稳定性判据应用;④利用提供的成熟模型与代码加速科研进程,支撑课题研究与学术成果产出。; 阅读建议:建议结合文中提供的Simulink模型与MATLAB代码,按照“理论建模—仿真搭建—扫频激励—频响提取—Nyquist判据分析”的完整流程进行实践操作,重点关注扫频信号的注入方式、频率范围设置及阻抗曲线的物理意义解读,并参考博士论文复现案例深化对复杂动态耦合问题的理解。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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