//发送包 public void SendPackage(byte[] data) { byte[] sha = SignTool.ComputeSHA256(data, 0, data.Length); string key = SignTool.Hex2String(sha, 0, sha.Length); datapool[key] = data; Message msg = new Message(); msg.tag1 = 0x01; //0字节 msg.tag2 = 0x01; //1字节 msg.msgid = SignTool.RandomShort(); // 2 3 字节 //4~7 字节 var byteLength = BitConverter.GetBytes((UInt32)data.Length); for (var i = 0; i < 4; i++) { msg.data[i] = byteLength[i]; } //8 到39 字节 for (var i = 0; i < 32; i++) { msg.data[i + 4] = sha[i]; } SendMessage(msg, true); }
void OnMsg(Message msg) { Message srcmsg = null; if (msg.tag1 == 0x00 || msg.tag2 >= 0xa0)//如果是一条回复消息,找原始消息 { srcmsg = this.needBackMessage[msg.msgid]; } System.Threading.ThreadPool.QueueUserWorkItem((_state) => { if (msg.tag1 == 0x01 && msg.tag2 == 0x10)//请求数据 { int blockbegin = BitConverter.ToUInt16(msg.data, 0); int blockend = BitConverter.ToUInt16(msg.data, 2); string hash = SignTool.Hex2String(msg.data, 4, 32); if (datapool.ContainsKey(hash) == false) { //发送错误回应,下一步再说 } else { for (var i = blockbegin; i < blockend; i++) { int begin = i * 50; int end = (i + 1) * 50; //Send0102 Message msg1 = new Message(); msg1.tag1 = 0x01; msg1.tag2 = 0x02; msg1.msgid = msg.msgid;//这是一条回复消息 var bytepiece = BitConverter.GetBytes((ushort)i); msg1.data[0] = bytepiece[0]; msg1.data[1] = bytepiece[1]; var srcdata = datapool[hash]; for (var s = begin; s < end; s++) { if (s < srcdata.Length) { msg1.data[s - begin + 2] = srcdata[s]; } else { msg1.data[s - begin + 2] = 0; } } SendMessage(msg1, false); } //Send0103 Message msg2 = new Message(); msg2.tag1 = 0x01; msg2.tag2 = 0x03; msg2.msgid = msg.msgid;//这是一条回复消息 SendMessage(msg2, false); } } if (userHandleRecv != null) { userHandleRecv(msg, srcmsg); } }); }