public MsgReciver() { seqInfo = new ParsePacketMetaResult() { nextOffset = 0, found = false, dsplen = 0, contnetLen = 0 }; dataPart = new ParsePacketMetaResult() { nextOffset = 0, found = false, dsplen = 0, contnetLen = 0 }; sleepspan = new TimeSpan(0, 0, 0, 0, 10); }
ParsePacketMetaResult parseEachChunkOfPacket(byte[] array, int arycount) { int len = arycount; if (len > 5) { len = 5; } ParsePacketMetaResult res = new ParsePacketMetaResult(); for (int i = 0; i < len; i++) { res.contnetLen = (res.contnetLen << (i * 7)) | (buf[i] & 0x7F); if (buf[i] >= 0x80) { res.found = true; res.dsplen = i + 1; break; } } return(res); }
Task <ParsePacketMetaResult> receive_inner(WebSocket socket, byte[] ary, int offset) { return(socket.ReceiveAsync(ary, CancellationToken.None).ContinueWith(t => { var receiveRes = t.Result; var rcvedCount = receiveRes.Count; ParsePacketMetaResult ret; ret.nextOffset = offset + rcvedCount; if (ret.nextOffset > 0) { ret = parseEachChunkOfPacket(ary, ret.nextOffset); return ret; } else { ret = new ParsePacketMetaResult() { found = false, dsplen = 0, contnetLen = 0 }; } return ret; })); }
public (SmsgClientReq req, byte[] data) Receive(HttpContext context, WebSocket socket) { // // msgPart // do { var t = receive_inner(socket, buf, seqInfo.nextOffset); t.Wait(); seqInfo = t.Result; } while (!seqInfo.found && Sleep(new TimeSpan(0, 0, 0, 0, 10))); while (seqInfo.dsplen + seqInfo.contnetLen < seqInfo.nextOffset && Sleep(sleepspan)) { var t = receive_inner(socket, buf, seqInfo.nextOffset); t.Wait(); } var msg = SmsgClientReq.Parser.ParseFrom(buf, seqInfo.dsplen, seqInfo.contnetLen); // preparing for datapart; var leftlen = seqInfo.nextOffset - seqInfo.dsplen - seqInfo.contnetLen; if (leftlen > 0) { //TODO: we need to cut off this logic for better performance in the future buf.CopyTo(buf, seqInfo.dsplen + seqInfo.contnetLen); seqInfo.nextOffset = leftlen; } seqInfo.found = false; seqInfo.dsplen = 0; seqInfo.contnetLen = 0; // // dataPart // do { var t = receive_inner(socket, buf, seqInfo.nextOffset); t.Wait(); seqInfo = t.Result; } while (!seqInfo.found && Sleep(sleepspan)); while (seqInfo.dsplen + seqInfo.contnetLen < seqInfo.nextOffset && Sleep(sleepspan)) { var t = receive_inner(socket, buf, seqInfo.nextOffset); t.Wait(); } var data = new ArraySegment <byte>(buf, seqInfo.dsplen, seqInfo.contnetLen).ToArray(); //preparing for next msgPart leftlen = seqInfo.nextOffset - seqInfo.dsplen - seqInfo.contnetLen; if (leftlen > 0) { buf.CopyTo(buf, seqInfo.dsplen + seqInfo.contnetLen); seqInfo.nextOffset = leftlen; } //build a result return(msg, data); }