c++ - QTcpSocket 发送的数据比想要的多 - Qt/C++

标签 c++ qt sockets networking tcp

首先介绍一下我的情况: - Qt/C++ UI 桌面应用程序 - 嵌入式设备(Stm32l4xx 系列)+ATWINC1500 wifi 模块

我正在开发 gui 应用程序,以便通过套接字将命令和文件发送到嵌入式设备。

对于简单的命令,我已经全部成功完成,但是对于发送文件(GCODE 格式的文本文件),我遇到了一些问题。 嵌入式设备已经有一个套接字管理(不是我写的,所以我不可能修改套接字的管理方式,来自第三方公司),并且这种类型的文件的接收是以一种方式管理的API 等待发送文件的每一行,然后将其写入闪存的保留部分。

我的问题是,当我从 qt 应用程序发送文件时(通过读取每一行并在该行调用 write() ,实际上我的套接字发送了整个文件 block ,比如 50 行,导致我的设备没有管理文件接收。

我的发送代码是这样的:

void sendGCODE(const QString fileName)
{
    QFile *file = new QFile(fileName,this);
    bool result = true;
    if (file->open(QIODevice::ReadOnly))
    {

      while (!file->atEnd())
      {
          QByteArray bytes(file->readLine());

          result = communicationSocket->write(bytes);
          communicationSocket->flush();
          if(result)
          {

              console->append("-> GCODE line sent:"+ QString(bytes));

          }
          else
          {
              console->append("-> Error sending GCODE line!");
          }
       }
       file->close();
    }

}

你们中的任何人对我做错了什么有任何提示吗? 我已经搜索过并且有人建议在其他主题上为此目的最好使用 UDP 而不是 TCP 套接字,但不幸的是我无法触及嵌入式设备端代码。 谢谢你们!

编辑

根据评论的建议,我嗅探了 tcp 数据包并且数据包被正确发送(即每个数据包包含一行)。但是...在接收器(设备)处,我了解到内存方面有些事情没有得到很好的管理。一个例子:

  • 发件人发送行“G1 X470.492 Y599.623 F1000”;接收器正确接收字符串“G1 X470.492 Y599.623 F1000”
  • 接下来,如果线路长度小于上次发送,即发送“G1 Z5”,接收方收到:“G1 Z5\n\n.492 Y599.623 F1000”,可见使用的缓冲区存储数据包不是从以前的数据包内容重新初始化,新的部分覆盖以前的值,其余部分来自以前的数据包

我正在想办法重置那部分内存。

最佳答案

这都是错的。 TCP 不是面向消息的协议(protocol)。无法确保 TCP 数据包包含任何特定数量的数据。设备上的接收器代码也不能期望 - 您可能误解了接收器的代码,或者做错了什么(或者供应商是)。接收方必须做的是等待数据包,将数据包的数据添加到缓冲区,然后提取并处理尽可能多的完整行,然后将剩余的数据移动到缓冲区的开头。并在每个数据包上重复此操作。

因此您在错误的地方寻找错误的问题,除非您的设备从未有过工作的机会。如果该设备与其他软件一起工作正常,那么您的“打包”TCP 假设就站不住脚。

下面是如何进行:

  1. 如果该设备已上市并经测试可以正常工作,那么您找错地方了。

  2. 如果该设备是一个新产品并且仍在开发中,那么某个地方的某个人做了一些特别愚蠢的事情,您要么需要修复该愚蠢行为,要么让供应商修复它,或者聘请顾问来修复它。但要完全清楚:TCP 不是这样工作的,您不能接受“它就是这样”。

关于c++ - QTcpSocket 发送的数据比想要的多 - Qt/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50871741/

相关文章:

c++ - Metal - 针对内存延迟优化 GPU 矩阵乘法

C++ 返回对象的引用

C++ 状态机生成器

c++ - arm cortex a9 交叉编译奇怪的浮点行为

python - 对齐 qTableWidget 中的可检查项目

linux - 很难追踪基于 Qt 的应用程序的所有 Linux 依赖项

qt - 蓝牙:如何从MAP读取 “Message Notification Service”(MNS)中的消息? QT

php - 使用 php 和 delphi 的简单套接字?

java - Java 和 Python 之间通信的理想格式 "message"?

c++ - QSplitter 在 QWidget 和 QTabWidget 之间变得无法区分