Ejemplo n.º 1
0
        ArraySegment <byte> Output_WaitForStartMsg(DeliveryConnection output, ArraySegment <byte> data)
        {
            output.OnGetFrame = null;

            Output_OnReceiveStartMsg(output, data.Slice(1));
            return(null);
        }
Ejemplo n.º 2
0
        void Input_OnConnected(DeliveryConnection input)
        {
            DeliveryConnection output;

            #region get output
            while (true)
            {
                if (!outputQueue.TryDequeue(out output))
                {
                    break;
                }

                if (output.IsConnected)
                {
                    break;
                }
            }
            #endregion


            if (output == null)
            {
                inputQueue.Enqueue(input);
            }
            else
            {
                input.Bind(output);
                //OutPut_SendStartMsg
                output.SendFrameAsync(StartMsg);

                Logger.Info($" [{output.GetHashCode()}] 转发成功");
            }
        }
Ejemplo n.º 3
0
        void Output_OnConnected(DeliveryConnection output)
        {
            output.Conn_OnDisconnected = (conn) =>
            {
                StartNewOutput();
            };

            output.OnGetFrame = Output_WaitForAuth;

            //(x.2)send token
            output.SendFrameAsync(authTokenBytes);
        }
Ejemplo n.º 4
0
        void ServerOnInputConnected(DeliveryConnection conn)
        {
            string RemoteEndPoint = null;

            try
            {
                RemoteEndPoint = conn.socket?.RemoteEndPoint.ToString();

                client.Connect((conn2) =>
                {
                    conn.Bind(conn2);
                    Logger.Info("转发成功[" + RemoteEndPoint + "]");
                });
            }
            catch (Exception ex)
            {
                Logger.Error("转发失败[" + RemoteEndPoint + "]", ex);
            }
        }
Ejemplo n.º 5
0
        void Output_OnReceiveStartMsg(DeliveryConnection output, ArraySegment <byte> data)
        {
            StartNewOutput();

            localClient.Connect((local) =>
            {
                try
                {
                    if (data.Count != 0)
                    {
                        local.SendFrameAsync(data);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error(ex);
                }
                local.Bind(output);
            });
        }
Ejemplo n.º 6
0
        ArraySegment <byte> Output_WaitForAuth(DeliveryConnection output, ArraySegment <byte> data)
        {
            //(x.1)读取数据
            var byteList = output.ext as List <byte>;

            if (byteList == null)
            {
                output.ext = byteList = new List <byte>();
            }
            byteList.AddRange(data);

            if (byteList.Count < authTokenBytes.Length)
            {
                return(null);
            }

            #region (x.2)收到数据的长度 等于 token长度
            if (byteList.Count == authTokenBytes.Length)
            {
                if (authTokenBytes.SequenceEqual(byteList))
                {
                    //权限认证通过
                    Logger.Info("发起连接--成功-权限认证通过");

                    output.ext = null;

                    output.OnGetFrame = Output_WaitForStartMsg;
                    return(null);
                }
                else
                {
                    //权限认证不通过
                    Logger.Info("收到连接-失败-权限认证不通过");

                    output.ext        = null;
                    output.OnGetFrame = null;

                    output.Close();
                    return(null);
                }
            }
            #endregion

            #region (x.3)收到数据的长度 大于 token长度
            if (authTokenBytes.SequenceEqual(byteList.Take(authTokenBytes.Length)))
            {
                //权限认证通过 且已经接受到开始标志
                Logger.Info("发起连接--成功-权限认证通过");

                output.ext        = null;
                output.OnGetFrame = null;

                Output_OnReceiveStartMsg(output, byteList.Skip(authTokenBytes.Length + 1).ToArray());
                return(null);
            }
            else
            {
                //权限认证不通过
                Logger.Info("收到连接-失败-权限认证不通过");

                output.ext        = null;
                output.OnGetFrame = null;

                output.Close();
                return(null);
            }
            #endregion
        }
Ejemplo n.º 7
0
        ArraySegment <byte> Output_OnGetFrame(DeliveryConnection output, ArraySegment <byte> data)
        {
            //(x.1)读取数据
            var byteList = output.ext as List <byte>;

            if (byteList == null)
            {
                output.ext = byteList = new List <byte>();
            }
            byteList.AddRange(data);

            if (byteList.Count < authTokenBytes.Length)
            {
                return(null);
            }

            //(x.2)匹配不通过
            if (byteList.Count != authTokenBytes.Length || !authTokenBytes.SequenceEqual(byteList))
            {
                Logger.Info($" [{output.GetHashCode()}] 权限认证-不通过");
                output.Close();
                return(null);
            }

            //(x.3)匹配通过
            Logger.Info($" [{output.GetHashCode()}] 权限认证-通过");
            output.ext        = null;
            output.OnGetFrame = null;

            //(x.4)发送验证通过标志
            output.SendFrameAsync(authTokenBytes);


            #region (x.5)进行桥接或放入连接池
            DeliveryConnection input;

            #region get input
            while (true)
            {
                if (!inputQueue.TryDequeue(out input))
                {
                    break;
                }

                if (input.IsConnected)
                {
                    break;
                }
            }
            #endregion

            if (input == null)
            {
                outputQueue.Enqueue(output);
            }
            else
            {
                input.Bind(output);
                //OutPut_SendStartMsg
                output.SendFrameAsync(StartMsg);

                Logger.Info($" [{output.GetHashCode()}] 转发成功");
            }
            #endregion

            return(null);
        }
Ejemplo n.º 8
0
 private void Output_OnConnected(DeliveryConnection output)
 {
     output.OnGetFrame = Output_OnGetFrame;
     Logger.Info($" [{output.GetHashCode()}] 收到连接");
 }