QT中QTcpSocket的write函数问题

xiaoxiaokun888 2013-04-01 05:28:19
int TSocket::sendPackage(quint8 ucCommand, int nDataSize, const QByteArray &bytesData)
{
QByteArray bytesSend;
bytesSend.append(byteToBytes(ucCommand));
bytesSend.append(intToBytes(nDataSize));
bytesSend.append(bytesData);
if (write(bytesSend) == -1)
{
qDebug()<<"send package failed";
return -1;
}
emit sigSize(nDataSize);
qDebug("send package command:0x%x size:%d", ucCommand, nDataSize);
return 0;
}

当传送文件时,会发现每次调用write(bytesSend) 都会把bytesSend写入socket缓存中,无论多大文件,如果每次调用waitForWriten()函数,效率很低,求解决办法!
...全文
6388 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Muaji 2015-11-10
  • 打赏
  • 举报
回复
上面说错 是100微妙
Muaji 2015-11-10
  • 打赏
  • 举报
回复 2
用Qt的TCP的write之后,是不会直接从网口发送出去,而是写到了本地缓冲区了。因为Qt采用的是异步方式,write不会阻塞,是直接返回的,数据并没有真正立即从网口发出去,而这时如果write的频率过高则会将数据全部写入缓冲区(我测试的时候大概估计1000微妙以上的间隔才会发送,要不会一直写缓存),当频度降到一个值之后才会发送。所以一般如果有循环write,都是在write后面调用waitForBytesWritten阻塞,等待数据从网口发出,触发 bytesWritten()信号之后在继续程序。
D_lady 2015-05-18
  • 打赏
  • 举报
回复
waitForBytesWritten(-1)
Qiang327 2014-10-20
  • 打赏
  • 举报
回复
这个问题要怎么解决呢?
xiaoxiaokun888 2013-09-08
  • 打赏
  • 举报
回复
引用 13 楼 Xylons 的回复:
我也遇到了类似的问题: 服务器端读文件,然后有TcpSocket.write(buf)(我没有调用waitForBytesWritten函数),数据直接被写缓存里面,不发。大于300M的文件,貌似会有数据丢失,客户端只能收到部分数据,小文件(小于300M)倒是没这个问题,同求解啊!
后来怎么解决地啊 !
Xylons 2013-05-17
  • 打赏
  • 举报
回复
我也遇到了类似的问题: 服务器端读文件,然后有TcpSocket.write(buf)(我没有调用waitForBytesWritten函数),数据直接被写缓存里面,不发。大于300M的文件,貌似会有数据丢失,客户端只能收到部分数据,小文件(小于300M)倒是没这个问题,同求解啊!
xiaoxiaokun888 2013-04-09
  • 打赏
  • 举报
回复
引用 11 楼 openXMPP 的回复:
引用 10 楼 xiaoxiaokun888 的回复:引用 9 楼 openXMPP 的回复:引用 7 楼 xiaoxiaokun888 的回复:引用 6 楼 openXMPP 的回复:1) 你可以把socket缓存设大点,socket层的缓存可以设置到64K,linux下可以设置到300K左右 2) 发送时,如果数据过大或缓冲区满,用TCP发送的话,是会等到套接口可写……
就是几百M的文件发送吧!调用QTcpSocket wirte方法,一直写,不发,之后文件读完了。 查看了下源码,大概用地“双缓存”。自己另开辟了一段内存存储!
乔巴好萌 2013-04-09
  • 打赏
  • 举报
回复
引用 10 楼 xiaoxiaokun888 的回复:
引用 9 楼 openXMPP 的回复:引用 7 楼 xiaoxiaokun888 的回复:引用 6 楼 openXMPP 的回复:1) 你可以把socket缓存设大点,socket层的缓存可以设置到64K,linux下可以设置到300K左右 2) 发送时,如果数据过大或缓冲区满,用TCP发送的话,是会等到套接口可写时才能写的。 诶。。这个应该是QT socket……
不知道你怎么定义"大"的,我做流媒体,1Mb带宽,跑个100路很轻松
xiaoxiaokun888 2013-04-09
  • 打赏
  • 举报
回复
引用 9 楼 openXMPP 的回复:
引用 7 楼 xiaoxiaokun888 的回复:引用 6 楼 openXMPP 的回复:1) 你可以把socket缓存设大点,socket层的缓存可以设置到64K,linux下可以设置到300K左右 2) 发送时,如果数据过大或缓冲区满,用TCP发送的话,是会等到套接口可写时才能写的。 诶。。这个应该是QT socket上层封装的问题了 怎么会是上层问题呢,……
如果还用qt库的话,就是写1M左右就阻塞着,等1M发出区,再继续写。 再问一下,你用QT传过大数据量东西吗——
乔巴好萌 2013-04-09
  • 打赏
  • 举报
回复
引用 7 楼 xiaoxiaokun888 的回复:
引用 6 楼 openXMPP 的回复:1) 你可以把socket缓存设大点,socket层的缓存可以设置到64K,linux下可以设置到300K左右 2) 发送时,如果数据过大或缓冲区满,用TCP发送的话,是会等到套接口可写时才能写的。 诶。。这个应该是QT socket上层封装的问题了
怎么会是上层问题呢,举个例子发送100mb数据,发了10mb后对端socket关闭,余下数据永远处于不可写状态,你让qtcpsocket怎么处理余下数据是丢还是继续发,难道这不是调用者要考虑的吗
xiaoxiaokun888 2013-04-07
  • 打赏
  • 举报
回复 1
求大神指点!
雲天之巔 2013-04-06
  • 打赏
  • 举报
回复
引用 2 楼 xiaoxiaokun888 的回复:
引用 1 楼 nlstone 的回复:socket是buffered device, 本来就会先写到缓冲,再发出去,你的问题是什么,没看明白?网络传输的速度本来就是有限的,如果你要数据传出去再接着处理,等待是必须的啊。比较效率的等待是连一个槽到bytesWritten()信号上,这样不会直接冻结你的UI. 会发现每次调用write(bytesSend) 都会把b……
你先看一下 write(bytesSend) 这个返回值是多少吧。
xiaoxiaokun888 2013-04-06
  • 打赏
  • 举报
回复
引用 6 楼 openXMPP 的回复:
1) 你可以把socket缓存设大点,socket层的缓存可以设置到64K,linux下可以设置到300K左右 2) 发送时,如果数据过大或缓冲区满,用TCP发送的话,是会等到套接口可写时才能写的。
诶。。这个应该是QT socket上层封装的问题了
乔巴好萌 2013-04-06
  • 打赏
  • 举报
回复
1) 你可以把socket缓存设大点,socket层的缓存可以设置到64K,linux下可以设置到300K左右 2) 发送时,如果数据过大或缓冲区满,用TCP发送的话,是会等到套接口可写时才能写的。
xiaoxiaokun888 2013-04-06
  • 打赏
  • 举报
回复
引用 3 楼 qq214517703 的回复:
引用 2 楼 xiaoxiaokun888 的回复:引用 1 楼 nlstone 的回复:socket是buffered device, 本来就会先写到缓冲,再发出去,你的问题是什么,没看明白?网络传输的速度本来就是有限的,如果你要数据传出去再接着处理,等待是必须的啊。比较效率的等待是连一个槽到bytesWritten()信号上,这样不会直接冻结你的UI. 会发……
正常
xiaoxiaokun888 2013-04-06
  • 打赏
  • 举报
回复
求大牛指点!
xiaoxiaokun888 2013-04-03
  • 打赏
  • 举报
回复
引用 1 楼 nlstone 的回复:
socket是buffered device, 本来就会先写到缓冲,再发出去,你的问题是什么,没看明白?网络传输的速度本来就是有限的,如果你要数据传出去再接着处理,等待是必须的啊。比较效率的等待是连一个槽到bytesWritten()信号上,这样不会直接冻结你的UI.
会发现每次调用write(bytesSend) 都会把bytesSend写入socket缓存中,无论多大文件 也就是说一直往缓存里面写,不发,,300多M的文件也这样
nlstone 2013-04-02
  • 打赏
  • 举报
回复
socket是buffered device, 本来就会先写到缓冲,再发出去,你的问题是什么,没看明白?网络传输的速度本来就是有限的,如果你要数据传出去再接着处理,等待是必须的啊。比较效率的等待是连一个槽到bytesWritten()信号上,这样不会直接冻结你的UI.

16,815

社区成员

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

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