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); } }
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); } }
public void Decode(Zeze.Serialize.Serializable _s_) { Zeze.Serialize.ByteBuffer _bb_ = Zeze.Serialize.ByteBuffer.Wrap(_Bytes, Offset, Count); _s_.Decode(_bb_); }
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."); }
/// <summary> /// 这里实际上直接wrap传入的bytes,所以必须保证之后不能再修改bytes的值了。 /// 【一般用于临时存储】 /// </summary> /// <param name="bb"></param> public Binary(Zeze.Serialize.ByteBuffer bb) : this(bb.Bytes, bb.ReadIndex, bb.Size) { }