Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QTcpSocket发送的数据比所需的多-Qt/C++;_C++_Qt_Sockets_Networking_Tcp - Fatal编程技术网

C++ QTcpSocket发送的数据比所需的多-Qt/C++;

C++ QTcpSocket发送的数据比所需的多-Qt/C++;,c++,qt,sockets,networking,tcp,C++,Qt,Sockets,Networking,Tcp,首先介绍一下我的情况: -Qt/C++UI桌面应用程序 -嵌入式设备(Stm32l4xx系列)+ATWINC1500无线模块 我正在开发gui应用程序,以便通过套接字向嵌入式设备发送命令和文件 对于简单的命令,我都成功地完成了,但是对于发送文件(GCODE格式的文本文件),我遇到了一些问题。 嵌入式设备已经有了套接字管理(不是我写的,因此我无法修改来自第三方公司的套接字管理方式),并且该类型文件的接收以API等待发送的每一行文件的方式进行管理,然后将其写入闪存的保留部分 我的问题是,当我从qt应

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

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

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

我的问题是,当我从qt应用程序发送文件时(通过读取每一行并在该行上调用write()),实际上我的套接字发送整个文件块,比如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不是面向消息的协议。无法确保TCP数据包包含任何特定数量的数据。设备上的接收器代码也不能预料到这一点-您可能误解了接收器的代码,或者正在执行其他操作出错(或供应商出错)。接收方必须做的是等待数据包,将数据包的数据添加到缓冲区,然后提取并处理尽可能多的完整行,然后将剩余数据移动到缓冲区的开头。并在每个数据包上重复该操作

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

以下是如何继续:

  • 如果该设备是商用的,并且经过测试可以正常工作,那么你找错地方了

  • 如果该设备是一个新产品,仍在开发中,那么某个地方有人做了一些特别愚蠢的事情,你要么需要纠正这种愚蠢行为,要么让供应商纠正它,要么请顾问纠正它。但要完全清楚:TCP不是这样工作的,你不能仅仅接受“它是这样的”


  • 在写行之间添加一些睡眠?你有没有检查过像wireshark这样的工具,你实际上在生成什么流量?@AlanBirtles哇,我有多蠢,我现在来检查wireshark日志,看看我到底在发送什么。我已经考虑过睡眠,但这不是一个好主意,因为它会反复阻止我的UI,这不是我想要的。所以根本原因是您的设备和/或其协议已无法修复地损坏。TCP流控制应该在接收器准备好之前关闭发送。@很抱歉,我无法获取“在接收器准备好之前应该关闭发送”部分。你在说什么?你关于发送代码的问题是离题的,因为代码是有效的。也许你应该问一下如何在设备本身中修复接收代码-这是一个好问题,正确的实现是如此微不足道(10-20行C)我很困惑,设备供应商竟然弄错了。谢谢你的回复。我更喜欢与更有礼貌、不那么自负的人聊天,但事实是,似乎很多人都知道所有人都在那里。回答某人的问题有不同的方式。但是,没关系,我会感谢你的有用提示,我会尽快开始为了更好地理解我的错误所在以及如何修复它。谢谢