示例#1
0
 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);
 }
示例#2
0
        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);
        }
示例#3
0
 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;
     }));
 }
示例#4
0
        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);
        }