【关于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;
}
...全文
741 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 修改

18,356

社区成员

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

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