node的一个上位机和下位机通信的转发程序,用的是udp转发.

其中在发送的时候会进行一次rc4加密数据

出现问题就在这个加密数据这一块,因为这个是升级包广播发送.提前生成了升级用的广播报文,是一个buffer数组,前四个元素是升级请求体,后面依次是升级包体.

上位机控制程序发送次数,一般设置三次.

发送升级包数据是采用递归调用发送,升级包发送方法

function sendUpgradePackage(gatewayId, buffer, port, address, sendnum = 1, index = 0, send = 0) {
if (!common.upgradeflag[gatewayId].ret) {
return;
}
if (index >= buffer.length) {
send++;
if (send >= sendnum) {
common.upgradeflag[gatewayId].ret = false;
return;
} else {
index = 0;
}
} console.log(index, send, '===>>>buff', buffer[index].toString('hex')); sendCipherMessage(buffer[index], 0, buffer.length, port, address, err => {
if (err) {
log.appendLog('send_error:' + err);
}
});
index++;
setTimeout(function() {
sendUpgradePackage(gatewayId, buffer, port, address, sendnum, index, send);
}, 100);
}

后续是一个rc4加密数据包的方法  代码省略部分

  parseBody.buffer = databuffer.slice(cipherlen, cipherlen + parseBody.length);
// console.log('密钥', parseBody.deviceId, '=====>>>>>', createwaytewaykey.GATEWAYKEYDIR[parseBody.deviceId].key);
let decipher = crypto.createCipheriv('rc4', createwaytewaykey.GATEWAYKEYDIR[parseBody.deviceId].key, '');
parseBody.buffer = decipher.update(parseBody.buffer);
parseBody.buffer.copy(databuffer, cipherlen);

其中databuffer 就是传过来的buffer[index]

因为直接对这个参数进行了修改导致第一遍发送的时候数据是正常的,第二遍发送的时候数据就开始错误.因为第一遍发送的时候将原buffer数组内数组内容改变了,导致对加密过的数据进行再次加密,下位机就无法解析数据.

这个问题排查后又发现了另一个问题,就是不加密的问题~~~因为在调试过程中一直重启服务,导致服务内存没保存网关的key,导致没有加密,后续网关心跳上来以后才开始对后续的加密.

整个服务已经过于混乱,需要兼容很多旧设备,其中的字节流解析差异太大,各种判断进行解析.

整个上位机也出现了这个问题,因为设备等问题,导致整个表结构不适合现在的设备存储.但是一直没有时间重构,也不敢大的重构,面向的api过多过杂.牵一发动全身.

这段时间都是做node后端,建了一个群 做后端node的可以一起交流一下 932491438

node种buffer对象数组 深拷贝浅拷贝问题的更多相关文章

  1. python: 序列化/反序列化及对象的深拷贝/浅拷贝

    一.序列化/反序列化 python中内置了很多序列化/反序列化的方式,最常用的有json.pickle.marshal这三种,示例用法如下: import json import pickle imp ...

  2. nodeJS之二进制buffer对象

    前面的话 在ES6引入TypedArray之前,JavaScript语言没有读取或操作二进制数据流的机制.Buffer类被引入作为Nodejs的API的一部分,使其可以在TCP流和文件系统操作等场景中 ...

  3. Node.js Buffer(缓冲区)

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...

  4. 8、Node.js Buffer(缓冲区)

    内容:Buffer与字符编码,Buffer创建.写入.读取.转换成JSON对象.合并.比较.拷贝.裁剪.长度 Buffer 与字符编码Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 . ...

  5. ES6 set和map数据结构对对象数组去重简单实现

    自从有了es6的set数据结构,数组的去重可以简单用一行代码实现,比如下面的方式 let arr = [1, 2, 2, 3, 4] function unique (arr) { return [. ...

  6. fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化

    fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化 在开发过程中,经常需要和前端交互数据,数据交互的格式都是JSON,在此过程中免不了json字符串 ...

  7. JS中实现数组和对象的深拷贝和浅拷贝

    数组的拷贝 > 数组的深拷贝,两层 var arr = [[1,2,3],[4,5,6],[7,8,9]]; var arr2 = []; 循环第一层数组 for(var i=0,len=arr ...

  8. js 中数组或者对象的深拷贝和浅拷贝

    浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变! 深拷贝:就是重新复制一块内存,这样就不会互相影响. 有些时候我们定义 ...

  9. JS对象复制(深拷贝、浅拷贝)

    如何在 JS 中复制对象 在本文中,我们将从浅拷贝(shallow copy)和深拷贝(deep copy)两个方面,介绍多种 JS 中复制对象的方法. 在开始之前,有一些基础知识值得一提:Javas ...

随机推荐

  1. eclipse 连接sql sever

    https://www.cnblogs.com/newen/p/4428541.html 和eclipse连接mysql相似,只是 String url="jdbc:sqlserver:// ...

  2. Grafana & Graphite & Collectd:监控系统

    简介 监控是运维工作中的一个重要组成部分,今天介绍一套新的监控工具,方便好用,扩展性强,这套工具有三个组件,Grafana & Graphite & Collectd: Grafana ...

  3. C语言寒假大作战04

    问题 答案 这个作业属于那个课程 https://edu.cnblogs.c0m/campus/zswxy/CST2019-4 这个作业的要求在哪里 https://edu.cnblogs.com/c ...

  4. javascript 浅复制 和 深复制

    如何区分深拷贝与浅拷贝,简单点来说,就是假设 B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝, 如果B没变,那就是深拷贝 实现思路 1 json 深度拷贝 2 遍历递归 ...

  5. [MacOS]MacOS字体文件位置

    $ cd /System/Library/Fonts $ ls Apple Braille Outline 6 Dot.ttf Noteworthy.ttc SFCompactText-Regular ...

  6. 实训第八天 有关python orm 的学习记录 常用方法01

    沿用第七天的数据库,数据库现在是这样的: 配置好主路由include子路由 子路由引入views 在views页面定义test测试请求如下: def test(request): # 1.all()方 ...

  7. iis添加asp.net网站,访问提示:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射

    今天在iis服务器配置asp.net网站,遇到一个问题,记录一下: 问题:由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. Windo ...

  8. Python 中使用 Pillow 处理图片增加水印

    这个是个比较常见的需求,比如你在某个网站上发布了图片,在图片上就会出现带你昵称的水印.那么在Python中应该如何处理这一类需求呢? 其实在我的<Django实战开发>视频教程中有讲到这一 ...

  9. 并发编程之J.U.C的第二篇

    并发编程之J.U.C的第二篇 3.2 StampedLock 4. Semaphore Semaphore原理 5. CountdownLatch 6. CyclicBarrier 7.线程安全集合类 ...

  10. The Ether 靶场

    0x01 首先对靶场进行端口扫描 发现只开启了80端口和22端口 0x02 目录扫描 访问了几个目录并没有什么发现 0x03 访问主页几个网站链接 发现了一个疑似文件包含的漏洞 0x04 抓包进行分析 ...