我创建了一个允许使用RTCPeerConnection
和传输文件的页面datachannels
。
我需要以某种方式确保接收和传输的文件完全相同,特别是没有一个包丢失,也没有中间的坏人发送邪恶的包。
我将文件分割成块,一块一块地发送这些块,没有任何标识。当另一端出现新的 webrtc 消息时,我将其数据推送到缓冲区而无需任何检查。当传输的大小等于接收的大小时,我组装文件。
这个 while 过程如下所示:
发件人
function sliceFile(offset)
var reader = new window.FileReader();
reader.onload = (function () {
return function (e) {
sendChannel.send(e.target.result);
if (self.file.size > offset + e.target.result.byteLength) {
window.setTimeout(self.sliceFile, 0, offset + CHUNK_SIZE);
}
};
})(self.file);
}
接收者
var receiveBuffer = [];
var receivedSize = 0;
onwebrtcmessage = function(event) {
receiveBuffer.push(event.data);
receivedSize += event.data.byteLength;
if (receivedSize == expectedSize) {
assembleFile(receiveBuffer);
}
}
我的问题是: 验证收到的文件是否正确的最佳方法是什么?
我试图在发送者和接收者上计算文件的 md5 校验和。由于FileApi
不会产生任何我已知的计算校验和的函数,并且 javascript 的实现会md5
杀死超过 15MB 文件的选项卡。这使我无法检查大文件的校验和。