Пример #1
0
        private async Task DataOnByRead(ReadBytes read, byte runtype)
        {
            var cmd = read.ReadInt32();

            if (cmd.HasValue)
            {
                var id = (read.ReadInt64()).GetValueOrDefault(-1);
                if (MethodInstanceDict.TryGetValue(cmd.Value, out InstanceRegister service))
                {
                    var argslen = (read.ReadInt32()).Value;
                    if (argslen == service.ArgsLen)
                    {
                        object[] args = new object[argslen];
                        for (int i = 0; i < argslen; i++)
                        {
                            args[i] = base.ReadData(read, service.ArgsType[i]);
                        }


                        RunCall(service, cmd.Value, id, runtype, args);
                    }
                    else
                    {
                        Log.WarnFormat("call method tag :{0} Args Error: len {1}->{2}  to\r\n  {3}", cmd.Value, argslen, service.ArgsType.Length, service);
                        await SendError(id, $"call method tag :{ cmd.Value} Args Error: len {argslen}->{service.ArgsType.Length}  to\r\n  {service}", ErrorType.ArgLenErr);
                    }
                }
            }
            else
            {
                Log.WarnFormat("call read cmd error");
                await SendError(-1, "not read cmd", ErrorType.NotReadCmd);
            }
        }
Пример #2
0
        static void  DataOn(ReadBytes read, IFiberRw <string> fiberRw)
        {
            var cmd = read.ReadInt32();
            var p1  = read.ReadInt32();
            var p2  = read.ReadInt64();
            var p3  = read.ReadDouble();
            var p4  = read.ReadSingle();
            var p5  = read.ReadBoolean();
            var p6  = read.ReadBoolean();
            var p7  = read.ReadString();
            var p8  = read.ReadMemory();
            var p9  = read.ReadInt16();


            // var p10 = read.ReadObject<List<Guid>>();
            // read.Dispose();


            using (WriteBytes writeBytes = new WriteBytes(fiberRw))
            {
                writeBytes.WriteLen();
                writeBytes.Cmd(cmd);
                writeBytes.Write(p1);
                writeBytes.Write(p2);
                writeBytes.Write(p3);
                writeBytes.Write(p4);
                writeBytes.Write(p5);
                writeBytes.Write(p6);
                writeBytes.Write(p7);
                writeBytes.Write(p8);
                writeBytes.Write(p9);
                //writeBytes.Write(p10);
                writeBytes.Flush();
            }
        }
Пример #3
0
        protected virtual void ReadResult(ReadBytes read)
        {
            var id = read.ReadInt64();

            if (read.ReadBoolean()) //is error
            {
                AsyncBackResult(new Result()
                {
                    Id       = id,
                    ErrorId  = (read.ReadInt32()),
                    ErrorMsg = read.ReadString()
                });
            }
            else
            {
                var           count = (read.ReadInt32());
                List <byte[]> args  = new List <byte[]>(count);
                for (int i = 0; i < count; i++)
                {
                    args.Add(read.ReadArray());
                }

                AsyncBackResult(new Result(args)
                {
                    Id = id
                });
            }
        }
Пример #4
0
        private async Task DataOnByRead(ReadBytes read, byte runtype)
        {
            var cmd = read.ReadInt32();
            var id  = read.ReadInt64();

            if (MethodInstanceDict.TryGetValue(cmd, out InstanceRegister service))
            {
                var argslen = read.ReadInt32();
                if (argslen == service.ArgsLen)
                {
                    object[] args = new object[argslen];
                    for (int i = 0; i < argslen; i++)
                    {
                        args[i] = base.ReadData(read, service.ArgsType[i]);
                    }

                    RunCall(service, cmd, id, runtype, args);
                }
                else
                {
                    Log.WarnFormat("call method tag :{cmd} Args Error: len {argslen}->{Length}  to\r\n  {service}"
                                   , cmd
                                   , argslen
                                   , service.ArgsType.Length
                                   , service);
                    await SendError(id, $"call method tag :{ cmd} Args Error: len {argslen}->{service.ArgsType.Length}  to\r\n  {service}", ErrorType.ArgLenErr);
                }
            }
        }
Пример #5
0
        protected virtual async Task DataOnByLine(IFiberRw fiberRw)
        {
            using (ReadBytes read = new ReadBytes(fiberRw))
            {
                await read.Init();

                var cmd = read.ReadInt32();

                switch (cmd)
                {
                case 2000:     //set session
                {
                    var sessionid = (read.ReadInt64()).GetValueOrDefault(0);
                    Log.TraceFormat("save sessionid {0}", sessionid);
                    Session.SaveSessionId(sessionid);
                }
                break;

                case 2400:     //Call It
                {
                    await Calling(read);
                }
                break;

                case 2500:     //set result
                {
                    ReadResult(read);
                }
                break;

                default:
                    throw new NetxException($"data error:{cmd.GetValueOrDefault()}", ErrorType.ReadErr);
                }
            }
        }
Пример #6
0
        protected virtual void ReadResult(ReadBytes read)
        {
            var id = read.ReadInt64();

            if (id.HasValue)
            {
                if ((read.ReadBoolean()).Value) //is error
                {
                    AsyncBackResult(new Result()
                    {
                        Id       = id.Value,
                        ErrorId  = (read.ReadInt32()).Value,
                        ErrorMsg = read.ReadString()
                    });
                }
                else
                {
                    var           count = (read.ReadInt32()).Value;
                    List <byte[]> args  = new List <byte[]>(count);
                    for (int i = 0; i < count; i++)
                    {
                        args.Add(read.ReadArray());
                    }

                    AsyncBackResult(new Result(args)
                    {
                        Id = id.Value
                    });
                }
            }
            else
            {
                throw new NetxException($"data error:2500", ErrorType.ReadErr);
            }
        }
Пример #7
0
        private void DataOn(byte[] data, SocketAsyncEventArgs socketAsync, ZYNetRingBufferPool stream)
        {
            ReadBytes read = new ReadBytes(data);

            if (read.Length >= 4)
            {
                if (read.ReadInt32(out int lengt) && lengt == read.Length)
                {
                    if (read.ReadByte() == 0xED &&
                        read.ReadByte() == 0xCE &&
                        read.ReadByte() == 0xFE &&
                        read.ReadByte() == 0x10)
                    {
                        long sessionId = read.ReadInt64();

                        if (sessionId == 0)
                        {
                            var token = MakeNewToken(socketAsync, stream, ref sessionId);
                            if (token != null)
                            {
                                BufferFormat session = new BufferFormat(0x10FECEED);
                                session.AddItem(sessionId);
                                Send(token.Sendobj, session.Finish());
                            }
                        }
                        else
                        {
                            if (TokenList.TryGetValue(sessionId, out ASyncToken token))
                            {
                                token.SetSocketEventAsync(socketAsync);
                                socketAsync.UserToken = token;
                                Log.Debug($"ReUse Token {token.SessionKey}");
                            }
                            else
                            {
                                var _token = MakeNewToken(socketAsync, stream, ref sessionId);
                                if (_token != null)
                                {
                                    BufferFormat session = new BufferFormat(0x10FECEED);
                                    session.AddItem(sessionId);
                                    Send(_token.Sendobj, session.Finish());
                                }
                            }
                        }
                    }
                    else
                    {
                        Server.Disconnect(socketAsync.AcceptSocket);
                    }
                }
                else
                {
                    Server.Disconnect(socketAsync.AcceptSocket);
                }
            }
Пример #8
0
        public void _LEFTConnect(ZYNetServer Server, ReadBytes read, ZYNetSession session)
        {
            long ToId;

            if (read.ReadInt64(out ToId))
            {
                if (Server.SessionDiy.ContainsKey(ToId) && !string.IsNullOrEmpty(session.WANIP) && session.WANPort != 0)
                {
                    ZYNetSession toUser = Server.SessionDiy[ToId];

                    if (toUser.Group != session.Group)
                    {
                        return;
                    }

                    if (!session.WANIP.Equals(toUser.WANIP)) //如果不再一个局域网内
                    {
                        LEFTConnect tmp = new LEFTConnect()
                        {
                            Id        = session.Id,
                            Host      = session.WANIP,
                            Port      = session.WANPort,
                            IsSuccess = true
                        };

                        Server.Send(toUser, BufferFormat.FormatFCA(tmp));
                    }
                    else //同局域网内
                    {
                        LEFTConnect tmp = new LEFTConnect()
                        {
                            Id        = session.Id,
                            Host      = session.LANIP,
                            Port      = session.NatNextPort,
                            IsSuccess = true
                        };

                        Server.Send(toUser, BufferFormat.FormatFCA(tmp));
                    }
                }
            }
        }
Пример #9
0
        /// <summary>
        /// 输入包输入回调
        /// </summary>
        /// <param name="data"></param>
        /// <param name="socketAsync"></param>
        private void RegServer_BinaryInput(byte[] data, SocketAsyncEventArgs socketAsync)
        {
            try
            {
                if (socketAsync.AcceptSocket != null)
                {
                    ReadBytes read = new ReadBytes(data);

                    int  length;
                    int  Cmd;
                    long key;
                    int  netport;
                    if (read.ReadInt32(out length) && length == read.Length && read.ReadInt32(out Cmd) && read.ReadInt64(out key) && read.ReadInt32(out netport))
                    {
                        if (Cmd == 100)
                        {
                            string ip   = ((IPEndPoint)socketAsync.AcceptSocket.RemoteEndPoint).Address.ToString();         //获取外网IP地址
                            int    port = int.Parse(((IPEndPoint)socketAsync.AcceptSocket.RemoteEndPoint).Port.ToString()); //获取端口号

                            if (SessionDiy.ContainsKey(key))                                                                //检查是否包含此KEY
                            {
                                SessionDiy[key].WANIP       = ip;
                                SessionDiy[key].WANPort     = port;
                                SessionDiy[key].NatNextPort = netport - 1;

                                LLOG(string.Format("注册端口号: 客户端Id: {0} 外网IP地址: {1}:{3} 下次开放端口: {2}", key, ip, netport, port), EventLogType.INFO);

                                RegService.SendData(socketAsync.AcceptSocket, new byte[] { 1 });
                            }
                        }
                    }
                }
            }
            catch (Exception er)
            {
                LLOG(er.ToString(), EventLogType.ERR);
            }
        }
Пример #10
0
        static void DataOn(byte[] data, SocketAsyncEventArgs e)
        {
            Console.WriteLine("ThreadId:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
            try
            {
                //建立一个读取数据包的类 参数是数据包
                //这个类的功能很强大,可以读取数据包的数据,并可以把你发送过来的对象数据,转换对象引用

                ReadBytes read = new ReadBytes(data);

                int lengt; //数据包长度,用于验证数据包的完整性
                int cmd;   //数据包命令类型

                //注意这里一定要这样子写,这样子可以保证所有你要度的数据是完整的,如果读不出来 Raed方法会返回FALSE,从而避免了错误的数据导致崩溃
                if (read.ReadInt32(out lengt) && read.Length == lengt && read.ReadInt32(out cmd))
                {  //read.Read系列函数是不会产生异常的
                    //根据命令读取数据包
                    switch (cmd)
                    {
                    case 1000:
                    {
                        int    version = read.ReadInt32();
                        long   data1   = read.ReadInt64();
                        float  data2   = read.ReadFloat();
                        double db1     = read.ReadDouble();
                        bool   b1      = read.ReadBoolean();
                        bool   b2      = read.ReadBoolean();
                        short  s1      = read.ReadInt16();
                        byte   sb1     = read.ReadByte();
                        string str1    = read.ReadString();
                        string str2    = read.ReadString();
                        byte[] datax   = read.ReadByteArray();

                        TestData tm2 = read.ReadObject <TestData>();

                        Console.WriteLine("int:" + version);
                        Console.WriteLine("long:" + data1);
                        Console.WriteLine("float:" + data2);
                        Console.WriteLine("double:" + db1);
                        Console.WriteLine("bool TRUE:" + b1);
                        Console.WriteLine("bool False:" + b2);
                        Console.WriteLine("short:" + s1);
                        Console.WriteLine("byte:" + sb1);
                        Console.WriteLine("string:" + str1);
                        Console.WriteLine("string:" + str2);
                        Console.WriteLine("bytes lengt:" + datax.Length);

                        BufferFormat buffer = new BufferFormat(1000);
                        buffer.AddItem(version);
                        buffer.AddItem(data1);
                        buffer.AddItem(data2);
                        buffer.AddItem(db1);
                        buffer.AddItem(b1);
                        buffer.AddItem(b2);
                        buffer.AddItem(s1);
                        buffer.AddItem(sb1);
                        buffer.AddItem(str1);
                        buffer.AddItem(str2);
                        buffer.AddItem(datax);


                        TestData tmx = new TestData()
                        {
                            Id   = 1,
                            Data = new List <string>()
                            {
                                "123123", "32123123"
                            },
                            Data2 = new List <Test2>()
                            {
                                new Test2 {
                                    A = 1, B = 2
                                }, new Test2 {
                                    A = 3, B = 4
                                }
                            }
                        };

                        buffer.AddItem(tmx);

                        server.SendData(e.AcceptSocket, buffer.Finish());
                    }
                    break;
                    }
                }
            }
            catch (Exception er)
            {
                Console.WriteLine(er.ToString());
            }
        }