예제 #1
0
        protected bool InternalTrySend(ISocketSession session, IProtoHandler protoHandler, ArraySegment<byte> segment)
        {
            if (!session.TrySend(segment))
                return false;

            return true;
        }
예제 #2
0
        protected void InternalSend(ISocketSession session, IProtoHandler protoHandler, ArraySegment<byte> segment)
        {
            if (!session.CanSend() || (protoHandler != null && !protoHandler.CanSend()))
                return;

            if (InternalTrySend(session, protoHandler, segment))
                return;

            var sendTimeOut = m_SendTimeOut;

            //Don't retry, timeout directly
            if (sendTimeOut < 0)
            {
                throw new TimeoutException("The sending attempt timed out");
            }

            var timeOutTime = sendTimeOut > 0 ? DateTime.Now.AddMilliseconds(sendTimeOut) : DateTime.Now;

            var spinWait = new SpinWait();

            while (session.CanSend())
            {
                spinWait.SpinOnce();

                if (InternalTrySend(session, protoHandler, segment))
                    return;

                //If sendTimeOut = 0, don't have timeout check
                if (sendTimeOut > 0 && DateTime.Now >= timeOutTime)
                {
                    throw new TimeoutException("The sending attempt timed out");
                }
            }
        }
예제 #3
0
        protected bool InternalTrySend(ISocketSession session, IProtoHandler protoHandler, ArraySegment <byte> segment)
        {
            if (!session.TrySend(segment))
            {
                return(false);
            }

            return(true);
        }
예제 #4
0
        public virtual bool TrySend(ISocketSession session, IProtoHandler protoHandler, ArraySegment <byte> data)
        {
            if (!session.CanSend() || (protoHandler != null && !protoHandler.CanSend()))
            {
                return(false);
            }

            return(InternalTrySend(session, protoHandler, data));
        }
예제 #5
0
            /// <summary>
            /// 取消注册包处理函数
            /// </summary>
            /// <param name="handler">要注册的网络消息包处理类.</param>
            public void UnRegisterHandler(IProtoHandler handler)
            {
                if (handler == null)
                {
                    throw new GameFrameworkException("Packet handler is invalid.");
                }

                this.UnRegisterHandler(handler.PacketId, handler.Handler);
            }
예제 #6
0
        protected void InternalSend(ISocketSession session, IProtoHandler protoHandler, ArraySegment <byte> segment)
        {
            if (!session.CanSend() || (protoHandler != null && !protoHandler.CanSend()))
            {
                return;
            }

            if (InternalTrySend(session, protoHandler, segment))
            {
                return;
            }

            var sendTimeOut = m_SendTimeOut;

            //Don't retry, timeout directly
            if (sendTimeOut < 0)
            {
                throw new TimeoutException("The sending attempt timed out");
            }

            var timeOutTime = sendTimeOut > 0 ? DateTime.Now.AddMilliseconds(sendTimeOut) : DateTime.Now;

            var spinWait = new SpinWait();

            while (session.CanSend())
            {
                spinWait.SpinOnce();

                if (InternalTrySend(session, protoHandler, segment))
                {
                    return;
                }

                //If sendTimeOut = 0, don't have timeout check
                if (sendTimeOut > 0 && DateTime.Now >= timeOutTime)
                {
                    throw new TimeoutException("The sending attempt timed out");
                }
            }
        }
예제 #7
0
 public virtual void Send(ISocketSession session, IProtoHandler protoHandler, ArraySegment <byte> data)
 {
     InternalSend(session, protoHandler, new ArraySegment <byte>[] { data });
 }
예제 #8
0
 public virtual void Send(ISocketSession session, IProtoHandler protoHandler, IList <ArraySegment <byte> > segments)
 {
     InternalSend(session, protoHandler, segments);
 }
예제 #9
0
 public override void Send(ISocketSession session, IProtoHandler protoHandler, IList<ArraySegment<byte>> segments)
 {
     base.Send(session, protoHandler, protoHandler.DataEncoder.EncodeData(segments));
 }
예제 #10
0
 public virtual void Send(ISocketSession session, IProtoHandler protoHandler, ArraySegment<byte> data)
 {
     InternalSend(session, protoHandler, new ArraySegment<byte>[] { data });
 }
예제 #11
0
 public virtual void Send(ISocketSession session, IProtoHandler protoHandler, IList<ArraySegment<byte>> segments)
 {
     InternalSend(session, protoHandler, segments);
 }
예제 #12
0
 public override bool TrySend(ISocketSession session, IProtoHandler protoHandler, IList <ArraySegment <byte> > segments)
 {
     return(base.TrySend(session, protoHandler, protoHandler.DataEncoder.EncodeData(segments)));
 }
예제 #13
0
 public override void Send(ISocketSession session, IProtoHandler protoHandler, IList <ArraySegment <byte> > segments)
 {
     base.Send(session, protoHandler, protoHandler.DataEncoder.EncodeData(segments));
 }
예제 #14
0
 public override void Send(ISocketSession session, IProtoHandler protoHandler, ArraySegment <byte> data)
 {
     base.Send(session, protoHandler, protoHandler.DataEncoder.EncodeData(data));
 }
예제 #15
0
 public override bool TrySend(ISocketSession session, IProtoHandler protoHandler, IList<ArraySegment<byte>> segments)
 {
     return base.TrySend(session, protoHandler, protoHandler.DataEncoder.EncodeData(segments));
 }
예제 #16
0
        public virtual bool TrySend(ISocketSession session, IProtoHandler protoHandler, ArraySegment<byte> data)
        {
            if (!session.CanSend() || (protoHandler != null && !protoHandler.CanSend()))
                return false;

            return InternalTrySend(session, protoHandler, data);
        }
예제 #17
0
 public override void Send(ISocketSession session, IProtoHandler protoHandler, ArraySegment<byte> data)
 {
     base.Send(session, protoHandler, protoHandler.DataEncoder.EncodeData(data));
 }