ZBLOG

void tcpServer::startSendpaper(QByteArray json_data) { int chunkSize = 800; // 设置每个数据块的大小为 1024 字节 qDebug()

根据你提供的 startSendpaper 函数的代码,以下是一些可能的问题和建议:

1. bytesWritten 更新逻辑问题

在你的代码中,更新 bytesWritten 的方式是 bytesWritten += sizeWritten - 10;。这意味着如果你发送的数据包实际大小小于 10 字节,会导致循环陷入死循环。因此,你应该直接将其更新为实际写入的字节数:

  1. bytesWritten += sizeWritten;

2. 数据块大小的处理

你设置的每个数据块大小为 800 字节,但在你计算要发送的数据时,如果剩余数据少于这个块大小,那么就会出现越界访问。这种情况可以通过在获取数据块时添加限制来避免:

  1. QByteArray chunk = json_data.mid(bytesWritten, qMin(chunkSize, json_data.size() - bytesWritten));

3. 网络传输中的错误处理

对于网络传输,可以考虑加入更多的错误处理。例如,在发送完所有数据后,应检查 sizeWritten 是否等于预期发送的字节数,并适当处理失败或部分成功情况。

4. 并发访问问题(可选)

如果多个线程可能同时调用 startSendpaper(),那么确保对共享资源(如 socket)的访问是线程安全的。可以使用互斥锁来保护对 socket 的操作(虽然已经注释掉了)。

完整修改后的示例

下面是结合以上建议后修改过的版本:

  1. void tcpServer::startSendpaper(QByteArray json_data)
  2. {
  3. int chunkSize = 800; // 设置每个数据块的大小为 800 字节
  4. qDebug() << "json_data.size() :" << json_data.size();
  5. QHash<int, st_Studbanswer*>::const_iterator it;
  6. for (it = ConnectClientInfo::GetSocketHash().constBegin(); it != ConnectClientInfo::GetSocketHash().constEnd(); ++it) {
  7. int bytesWritten = 0;
  8. while (bytesWritten < json_data.size()) {
  9. QByteArray chunk = json_data.mid(bytesWritten, qMin(chunkSize, json_data.size() - bytesWritten)); // 获取当前数据块
  10. QByteArray sendDataArray = SendData(vSendArrayHeardPaperData, chunk);
  11. QString str = QString::fromUtf8(sendDataArray);
  12. qDebug() << "sendDataArray" << str;
  13. int sizeWritten = send(it.key(), sendDataArray, sendDataArray.size(), 0); // 发送当前数据块
  14. if (sizeWritten == -1) {
  15. qDebug() << "Error sending data to socket";
  16. break;
  17. }
  18. bytesWritten += sizeWritten; // 更新已发送字节数
  19. }
  20. QByteArray sendDataArrayEnd = SendData(vSendArrayHeardPaperDataEnd, "");
  21. send(it.key(), sendDataArrayEnd, sendDataArrayEnd.size(), 0);
  22. }
  23. }

总结

  • 检查并更新 bytesWritten 的方法以避免死循环。
  • 确保不会越界访问数组。
  • 增加错误处理,以便更好地理解程序状态。
  • 如果需要考虑多线程环境,请确保对共享资源的正确同步。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22400

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?