[英]QTcpSocket sends more data than wanted - Qt/C++
首先介绍一下我的情况:-Qt / C ++ UI桌面应用程序-嵌入式设备(Stm32l4xx系列)+ ATWINC1500 wifi模块
我正在开发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数据包,并且数据包已正确发送(即,每个数据包包含一行)。 但是...在接收器(设备)上,我了解到有关内存的某些内容管理不善。 一个例子:
我试图弄清楚如何重置那部分内存。
都错了 TCP不是面向消息的协议。 无法确保TCP数据包包含任何特定数量的数据。 设备上的接收方代码也不能期望-您可能误解了接收方的代码,或者做错了其他事情(或供应商正在做的事情)。 接收者必须做的是等待一个数据包,将数据包的数据添加到缓冲区中,然后提取并处理尽可能多的完整行,然后将剩余的数据移至缓冲区的开头。 并在每个数据包上重复该操作。
因此,除非您的设备从未有过工作的机会,否则您正在错误的位置寻找错误的问题。 如果该设备可以与其他软件一起正常工作,则您的“打包” TCP假设不会起作用。
操作方法如下:
如果该设备在市场上有售,并且已经过测试工作,则说明您在错误的位置。
如果该设备是新产品并且仍在开发中,则某处某人做了一些特别愚蠢的事情,您要么需要解决该愚蠢问题,要么让供应商对其进行修复,或者雇用顾问对其进行修复。 只是要完全清楚:这不是TCP的工作方式,您不能仅仅接受“它就是这样”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.