微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何重新使用设置元素的向量?

所以我使用我的程序将我的Rasperry Pi相机stream到我的电脑。 下面列出的向量给我的问题。 它给了我约std::bad_alloc约30秒的stream。 有没有什么办法可以在一个循环中重复使用这个向量(例如resize,清除)? 这是简化的代码

while(isRunning) { recv(Connection,received_message,sizeof(received_message),NULL); //receiving the size of image in bytes fileSize = atoi(received_message); std::vector<char> fileData(fileSize); //<- this vector is giving me problems recv(Connection,&fileData[0],CHUNK_SIZE,0); //Receiving the image //The code loops over and over again }

即使阻塞closures,Python Lirc也会阻止代码

通过configuration识别树莓派主机

更改/ root / boot的所有权

使用linux操作内存中的位图图像

在Linux中模拟Up Arrowbutton

TCP是一个流媒体协议。 它没有消息的概念。 在连接的一端写入10,000个字节并不意味着所有的10,000个字节都会到达接收端并一次全部可用。

因此, recv与已有的一起工作。 它返回当前可用的任何东西,如果没有可用的东西, recv会等待,直到数据可用。 这意味着,如果要求输入10000个字节,则可能会在网络堆栈的意外事件中获得1个字节到10,000个字节之间的任何地方,一个IP数据包中可以发送的最大数据量以及其他要列出的其他变量。

所以

recv(Connection,NULL);

可能会在收到所有received_message之前返回。 fileSize将从坏的输入计算,很可能是一个字符串不是空终止,运行在缓冲区的末端触发未定义的行为,并垃圾进出垃圾

这个不正确的fileSize然后用来调整vector大小,现在几乎肯定是错误的大小。 如果太小,

recv(Connection,0);

可能会跑向vector的末尾以获得更多未定义的行为。 如果太大,系统可能无法为vector分配存储空间,因为没有足够的连续存储空间可用。 这似乎是OP发生的事情。

解决方案:将所有呼叫都转到recv直到所需的数据量到达后再继续。 写在另一个路径来处理关闭或失败的连接。 所有调用都必须读取正确的数据量

recv(Connection,0);

可能会提前离开下一个

recv(Connection,NULL);

像received_message一样读取图像的一部分,导致fileSize每一位都像疯狂,就好像received_message没有被完全填充一样。

另外考虑在recv上设置超时时间,以便您有机会读取退出标志,如果你想终止程序。 否则,可能会永远阻止永远不会到达的数据。

你可以像这样轻松地重用你的std::vector :

std::vector<char> fileData; while(isRunning) { ssize_t n = recv(Connection,0); //receiving the size of image in bytes if (n < 0) throw std::runtime_error(std::string("Connection error (getting fileSize)") + strerror(errno)); assert(n == sizeof(received_message)); fileSize = atoi(received_message); if (fileSize > maxFileSize or fileSize == 0) throw std::runtime_error("Invalid fileSize " + std::to_string(fileSize)); fileData.resize(fileSize); size_t received = 0; while (received < fileSize) { ssize_t n = recv(Connection,fileData.data() + received,fileSize - received,0); //Receiving the image if (n < 0) throw std::runtime_error(std::string("Connection error (getting image)") + strerror(errno)); received += n; } //The code loops over and over again }

一些注意事项:

处理第一个recv没有收到sizeof(received_message)字节(当前由assert保护)的事件,

你应该定义maxFileSize

包括<cassert> , <exception>和<string>标题

编译使用-std=c++11

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐