示例#1
0
 void ReSendTimeOut(KcpData link, Int16 time)
 {
     for (int i = 0; i < link.Msgs.Count; i++)
     {
         int os = time - link.Msgs[i].SendTime;
         if (os < 0)
         {
             os += 10000;
         }
         if (os >= MsgTimeOut)
         {
             var msg = link.Msgs[i];
             SendMsg(link, ref msg, time);
             link.Msgs[i] = msg;
         }
     }
 }
示例#2
0
        public void Success(ref MsgHead head, KcpData link)
        {
            unsafe
            {
                fixed(byte *bp = &tmp2[0])
                {
                    MsgReturn *hp = (MsgReturn *)bp;

                    hp->Type    = EnvelopeType.Success;
                    hp->MsgID   = head.MsgID;
                    hp->CurPart = head.CurPart;
                    hp->Time    = head.Time;
                }
            }
            int c = PackInt(tmp2, MsgReturn.Size, tmpBuffer);

            kcpListener.soc.SendTo(tmpBuffer, c, SocketFlags.None, link.endpPoint);
        }
示例#3
0
        public void ReciveMsg(byte[] buf, int len, KcpData link)
        {
            var tmp = recvBuffer.RegNew(len);

            tmp.DataCount = len;
            unsafe
            {
                byte *ptr = tmp.Addr;
                for (int i = 0; i < len; i++)
                {
                    ptr[i] = buf[i];
                }
            }
            SocMsg msg = new SocMsg();

            msg.link = link;
            msg.dat  = tmp;
            queue.Enqueue(msg);
        }
示例#4
0
        void SendMsg(KcpData link, ref MsgInfo msg, Int16 time)
        {
            if (msg.MsgID >= 60000)
            {
                kcpListener.UpdateBroadcastMsg(msg.MsgID);
            }
            int c = msg.data.DataCount;

            unsafe
            {
                byte *bp = msg.data.Addr;
                for (int i = 0; i < c; i++)
                {
                    tmpBuffer[i] = bp[i];
                }
            }
            msg.SendTime = time;
            msg.SendCount++;
            kcpListener.soc.SendTo(tmpBuffer, c, SocketFlags.None, link.endpPoint);
        }
示例#5
0
        public int SendMsg(KcpData link, Int16 time)
        {
            NetworkContent nc = new NetworkContent();

            while (link.Get(ref nc))
            {
                if (nc.dat == null)
                {
                    if (nc.MsgID >= 60000)//这是一个广播消息
                    {
                        var bm = kcpListener.FindBroadcastMsg(nc.MsgID);
                        if (bm != null)
                        {
                            int c = bm.data.DataCount;
                            for (int i = 0; i < c; i++)
                            {
                                MsgInfo info = new MsgInfo();
                                info.CurPart = (UInt16)i;
                                unsafe { info.data = bm.data.Addr[i]; }
                                info.MsgID      = (UInt16)nc.MsgID;
                                info.CreateTime = time;
                                info.SendTime   = time;
                                link.Msgs.Add(info);
                            }
                        }
                    }
                }
                else//这是一个私有消息
                {
                    link.MsgId++;
                    if (link.MsgId >= MaxID)
                    {
                        link.MsgId = MinID;
                    }
                    PackAll(link, nc.dat, (byte)nc.MsgID, link.MsgId, time);
                }
            }
            ReSendTimeOut(link, time);
            return(link.Msgs.Count);
        }
示例#6
0
        void PackAll(KcpData link, byte[] dat, byte type, UInt16 msgId, Int16 time)
        {
            int len = dat.Length;
            int p   = len / FragmentSize;
            int r   = len % FragmentSize;
            int all = p;//总计分卷数量

            if (r > 0)
            {
                all++;
            }
            int s = 0;

            unsafe
            {
                fixed(byte *bp = &tmpBuffer[0])
                {
                    for (int i = 0; i < p; i++)
                    {
                        MsgHead *head = (MsgHead *)bp;
                        head->Type    = type;
                        head->MsgID   = msgId;
                        head->CurPart = (UInt16)i;
                        head->AllPart = (UInt16)all;
                        head->PartLen = (UInt16)FragmentSize;
                        head->Lenth   = (UInt32)len;
                        head->Time    = time;
                        byte *dp = bp + MsgHead.Size;
                        for (int j = 0; j < FragmentSize; j++)
                        {
                            dp[j] = dat[s];
                            s++;
                        }
                        MsgInfo msg = new MsgInfo();
                        msg.data       = PackInt(FragmentSize + MsgHead.Size);
                        msg.MsgID      = msgId;
                        msg.CurPart    = (UInt16)i;
                        msg.CreateTime = time;
                        SendMsg(link, ref msg, time);
                        link.Msgs.Add(msg);
                    }
                    if (r > 0)
                    {
                        MsgHead *head = (MsgHead *)bp;
                        head->Type    = type;
                        head->MsgID   = msgId;
                        head->CurPart = (UInt16)p;
                        head->AllPart = (UInt16)all;
                        head->PartLen = (UInt16)r;
                        head->Lenth   = (UInt32)len;
                        head->Time    = time;
                        byte *dp = bp + MsgHead.Size;
                        for (int j = 0; j < r; j++)
                        {
                            dp[j] = dat[s];
                            s++;
                        }
                        MsgInfo msg = new MsgInfo();
                        msg.data       = PackInt(r + MsgHead.Size);
                        msg.MsgID      = msgId;
                        msg.CurPart    = (UInt16)p;
                        msg.CreateTime = time;
                        SendMsg(link, ref msg, time);
                        link.Msgs.Add(msg);
                    }
                }
            }
        }
示例#7
0
 public void Dispose()
 {
     link = null;
 }