Esempio n. 1
0
 public override void Close()
 {
     _closed = true;
     if (_timer != null)
     {
         _timer.Dispose();
     }
     base.Close();
     if (!_closesend)
     {
         _closesend = true;
         SendToPeer(UDPMeta.CreateSessionError(SessionId, "Close"));
     }
 }
        private void RejectConnect(ServerStream stream)
        {
            long sid     = stream.SessionId;
            bool removed = false;

            lock (this.strmap)
            {
                if (this.strmap.TryGetValue(sid, out ServerStream ss))
                {
                    if (ss == stream)
                    {
                        this.strmap.Remove(sid);
                        removed = true;
                    }
                }
            }
            if (removed)
            {
                this.udp.SendToClient(stream.RemoteEndPoint, UDPMeta.CreateSessionError(sid, "Reject"));
            }
        }
Esempio n. 3
0
        protected void ProcessUDPPackage(UDPPackageType pt, byte[] data)
        {
            //UDPPackageType pt = UDPMeta.GetPackageType(data);
            long sid = BitConverter.ToInt64(data, 8);

            //Console.WriteLine("ProcessUDPPackage:" + sid + ":" + pt);

            if (pt == UDPPackageType.SessionError)
            {
                this.Close();
            }
            else if (pt == UDPPackageType.SessionClose)
            {
                this.Close();
            }

            if (pt == UDPPackageType.DataPost)
            {
                if (this.closed)
                {
                    this.SendToPeer(UDPMeta.CreateSessionError(this.SessionId, "closed"));
                    return;
                }

                long peerminreadindex = BitConverter.ToInt64(data, 16);
                lock (this.postmap)
                {
                    this.OnGetPeerMinRead(peerminreadindex);
                }

                long dataindex = BitConverter.ToInt64(data, 24);

                //Console.WriteLine("DataPost:" + dataindex);

                if (dataindex == this.readminindex + 1)
                {
                    this.OnPost(data, 32, data.Length - 32);
                    this.readminindex = dataindex;
                    while (this.buffmap.TryGetValue(this.readminindex + 1, out byte[] buff))
Esempio n. 4
0
        protected void ProcessUDPPackage(UDPPackageType pt, byte[] data)
        {
            //UDPPackageType pt = UDPMeta.GetPackageType(data);
            long sid = BitConverter.ToInt64(data, 8);

            //Console.WriteLine("ProcessUDPPackage:" + sid + ":" + pt);

            if (pt == UDPPackageType.SessionError)
            {
                Close();
            }
            else if (pt == UDPPackageType.SessionClose)
            {
                Close();
            }

            if (pt == UDPPackageType.DataPost)
            {
                if (_closed)
                {
                    SendToPeer(UDPMeta.CreateSessionError(SessionId, "closed"));
                    return;
                }

                long peerminreadindex = BitConverter.ToInt64(data, 16);
                lock (_postmap)
                {
                    OnGetPeerMinRead(peerminreadindex);
                }

                long dataindex = BitConverter.ToInt64(data, 24);

                //Console.WriteLine("DataPost:" + dataindex);

                if (dataindex == _readminindex + 1)
                {
                    OnPost(data, 32, data.Length - 32);
                    _readminindex = dataindex;
                    byte[] buff;
                    while (_buffmap.TryGetValue(_readminindex + 1, out buff))
                    {
                        _readminindex++;
                        _buffmap.Remove(_readminindex);
                        OnPost(buff);
                    }
                    SendToPeer(UDPMeta.CreateDataRead(SessionId, _readminindex, dataindex));
                }
                else
                {
                    if (dataindex > _readmaxindex)
                    {
                        _readmaxindex = dataindex;
                    }
                    byte[] buff = new byte[data.Length - 32];
                    Buffer.BlockCopy(data, 32, buff, 0, buff.Length);
                    _buffmap[dataindex] = buff;
                }
            }
            if (pt == UDPPackageType.DataRead)
            {
                long peerminreadindex = BitConverter.ToInt64(data, 16);
                long dataindex        = BitConverter.ToInt64(data, 24);
                lock (_postmap)
                {
                    PostMapRemove(dataindex);
                    OnGetPeerMinRead(peerminreadindex);
                }
            }
            if (pt == UDPPackageType.DataMiss)
            {
                long peerminreadindex = BitConverter.ToInt64(data, 16);
                lock (_postmap)
                {
                    OnGetPeerMinRead(peerminreadindex);
                }

                int             misscount = (data.Length - 24) / 8;
                List <DataItem> list      = null;
                for (int missid = 0; missid < misscount; missid++)
                {
                    long     dataindex = BitConverter.ToInt64(data, 24 + missid * 8);
                    DataItem item      = null;
                    lock (_postmap)
                    {
                        _postmap.TryGetValue(dataindex, out item);
                    }
                    if (item != null)
                    {
                        if (list == null)
                        {
                            list = new List <DataItem>();
                        }
                        list.Add(item);
                    }
                }
                if (list != null)
                {
                    list.Sort(delegate(DataItem d1, DataItem d2)
                    {
                        return(d1.SendTime.CompareTo(d2.SendTime));
                    });
                    int maxsendagain = 65536;

                    foreach (DataItem item in list)
                    {
                        if (DateTime.Now - item.SendTime < TimeSpan.FromMilliseconds(GetPackageLostMS()))
                        {
                            break;
                        }
                        if (maxsendagain < item.UDPData.Length)
                        {
                            break;
                        }
                        maxsendagain -= item.UDPData.Length;
                        UDPMeta.UpdateDataRead(item.UDPData, _readminindex);
                        item.SendTime = DateTime.Now;
                        item.RetryCount++;
                        SendToPeer(item.UDPData);
                    }
                }
            }
            if (pt == UDPPackageType.DataPing)
            {
                long peerminreadindex = BitConverter.ToInt64(data, 16);
                lock (_postmap)
                {
                    OnGetPeerMinRead(peerminreadindex);
                }

                long        maxdataindex = BitConverter.ToInt64(data, 24);
                List <long> misslist     = null;
                for (long index = _readminindex + 1; index <= maxdataindex; index++)
                {
                    if (_buffmap.ContainsKey(index))
                    {
                        continue;
                    }
                    if (misslist == null)
                    {
                        misslist = new List <long>();
                    }
                    misslist.Add(index);
                    if (misslist.Count * 8 + 40 > UDPMeta.BestUDPSize)
                    {
                        break;
                    }
                }
                if (misslist != null)
                {
                    SendToPeer(UDPMeta.CreateDataMiss(SessionId, _readminindex, misslist.ToArray()));
                }
                else
                {
                    SendToPeer(UDPMeta.CreateDataRead(SessionId, _readminindex, _readminindex));
                }
            }
        }
Esempio n. 5
0
        void ListenerWorkThread()
        {
            while (this._workthread != null)
            {
                try
                {
                    //TODO: if not cached , and all stream closed , shutdown directly

                    IPEndPoint ep;
                    byte[]     data = _udp.Receive(TimeSpan.FromSeconds(90), out ep);
                    if (data == null)
                    {
                        Console.WriteLine("_udp.Receive return null for a long time...; Shutdown..." + this._udp.LocalEndPoint);
                        this.Close();
                        return;
                    }

                    UDPPackageType pt = UDPMeta.GetPackageType(data);
                    if (pt == UDPPackageType.Unknown)
                    {
                        //Console.WriteLine("_udp.Receive return Unknown;");
                        return;
                    }

                    long         sid = BitConverter.ToInt64(data, 8);
                    ServerStream ss;

                    //Console.WriteLine("_udp.Receive " + sid + ":" + pt);

                    if (pt == UDPPackageType.SessionConnect)
                    {
                        UDPConnectJson udpc = UDPConnectJson.Deserialize(Encoding.UTF8.GetString(data, 16, data.Length - 16));
                        lock (strmap)
                        {
                            if (!strmap.TryGetValue(sid, out ss))
                            {
                                ss          = new ServerStream(this, sid, ep, udpc);
                                strmap[sid] = ss;
                            }
                        }
                        if (ss.ConnectToken != udpc.token)
                        {
                            ss.ForceClose();
                            lock (strmap)
                            {
                                ss          = new ServerStream(this, sid, ep, udpc);
                                strmap[sid] = ss;
                            }
                        }
                        else
                        {
                            ss.Process(pt, data);
                        }
                    }
                    else
                    {
                        lock (strmap)
                        {
                            strmap.TryGetValue(sid, out ss);
                        }
                        if (ss != null)
                        {
                            ss.Process(pt, data);
                        }
                        else
                        {
                            _udp.SendToClient(ep, UDPMeta.CreateSessionError(sid, "NotFound"));
                        }
                    }
                }
                catch (ThreadAbortException)
                {
                    break;
                }
                catch (Exception x)
                {
                    TcpMapService.OnError(x);
                }
            }
        }