我创建了一个页面,允许使用RTCPeerConnection
和datachannels
传输文件。
我需要以某种方式确保接收和传输的文件完全相同,具体而言,没有任何软件包丢失,也没有坏人在中间发送恶包。
我将文件拆分成块,一块一块地发送这些块而没有任何标识。当另一方出现新的webrtc消息时,我将其数据推送到缓冲区,无需任何检查。当传输的大小等于接收的大小时,我组装文件。
这个过程看起来像:
发送方
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的文件的选项卡。这使我无法检查大文件的校验和。