Beispiel #1
0
 public override void OnSocketProcessInputBuffer(Zeze.Net.AsyncSocket so, Zeze.Serialize.ByteBuffer input)
 {
     if (so.IsHandshakeDone)
     {
         AppendInputBuffer(so.SessionId, input);
         input.ReadIndex = input.WriteIndex;
     }
     else
     {
         base.OnSocketProcessInputBuffer(so, input);
     }
 }
Beispiel #2
0
 internal void AppendInputBuffer(long socketSessionId, Zeze.Serialize.ByteBuffer buffer)
 {
     lock (this)
     {
         if (ToBuffer.TryGetValue(socketSessionId, out var exist))
         {
             exist.Append(buffer.Bytes, buffer.ReadIndex, buffer.Size);
             return;
         }
         Serialize.ByteBuffer newBuffer = Serialize.ByteBuffer.Allocate();
         ToBuffer.Add(socketSessionId, newBuffer);
         newBuffer.Append(buffer.Bytes, buffer.ReadIndex, buffer.Size);
     }
 }
Beispiel #3
0
 public void Decode(Zeze.Serialize.Serializable _s_)
 {
     Zeze.Serialize.ByteBuffer _bb_ = Zeze.Serialize.ByteBuffer.Wrap(_Bytes, Offset, Count);
     _s_.Decode(_bb_);
 }
Beispiel #4
0
        public override void DispatchUnknownProtocol(Zeze.Net.AsyncSocket so, int type, Zeze.Serialize.ByteBuffer data)
        {
            var linkSession = so.UserState as LinkSession;

            if (null == linkSession || null == linkSession.UserId)
            {
                ReportError(so.SessionId, Linkd.BReportError.FromLink, Linkd.BReportError.CodeNotAuthed, "not authed.");
                return;
            }

            var moduleId = global::Zeze.Net.Protocol.GetModuleId(type);
            var dispatch = new Provider.Dispatch();

            dispatch.Argument.LinkSid      = so.SessionId;
            dispatch.Argument.UserId       = linkSession.UserId;
            dispatch.Argument.ProtocolType = type;
            dispatch.Argument.ProtocolData = new Zeze.Net.Binary(data);
            dispatch.Argument.States.AddRange(linkSession.UserStates);
            dispatch.Argument.Statex = linkSession.UserStatex;

            long provider;

            if (linkSession.TryGetProvider(moduleId, out provider))
            {
                var socket = App.Instance.ProviderService.GetSocket(provider);
                if (null != socket)
                {
                    socket.Send(dispatch);
                    return;
                }
                // 原来绑定的provider找不到连接,尝试继续从静态绑定里面查找。
                // 此时应该处于 UnBind 过程中。
                //linkSession.UnBind(so, moduleId, null);
            }

            if (App.Instance.gnet_Provider.ChoiceProviderAndBind(moduleId, so, out provider))
            {
                var providerSocket = App.Instance.ProviderService.GetSocket(provider);
                if (null != providerSocket)
                {
                    // ChoiceProviderAndBind 内部已经处理了绑定。这里只需要发送。
                    providerSocket.Send(dispatch);
                    return;
                }
                // 找到provider但是发送之前连接关闭,当作没有找到处理。这个窗口很小,再次查找意义不大。
            }
            ReportError(so.SessionId, Linkd.BReportError.FromLink, Linkd.BReportError.CodeNoProvider, "no provider.");
        }
Beispiel #5
0
 /// <summary>
 /// 这里实际上直接wrap传入的bytes,所以必须保证之后不能再修改bytes的值了。
 /// 【一般用于临时存储】
 /// </summary>
 /// <param name="bb"></param>
 public Binary(Zeze.Serialize.ByteBuffer bb) : this(bb.Bytes, bb.ReadIndex, bb.Size)
 {
 }