public static void Awake(this RouterServiceInnerComponent self, IPEndPoint ipEndPoint)
        {
            self.StartTime      = TimeHelper.ClientNow();
            self.CurrTimeSecond = TimeHelper.ClientNowSeconds();
            self.socket         = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
            {
                self.socket.SendBufferSize    = Kcp.OneM * 64;
                self.socket.ReceiveBufferSize = Kcp.OneM * 64;
            }

            self.socket.Bind(ipEndPoint);
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                const uint IOC_IN            = 0x80000000;
                const uint IOC_VENDOR        = 0x18000000;
                uint       SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
                self.socket.IOControl((int)SIO_UDP_CONNRESET, new[] { Convert.ToByte(false) }, null);
            }
            self.OuterRouterService = self.Domain.GetComponent <RouterServiceComponent>();
        }
        private static void Recv(this RouterServiceInnerComponent self)
        {
            if (self.socket == null)
            {
                return;
            }
            while (self.socket != null && self.socket.Available > 0)
            {
                int messageLength = self.socket.ReceiveFrom(self.cache, ref self.ipEndPoint);

                // 长度小于1,不是正常的消息
                if (messageLength < 1)
                {
                    continue;
                }

                // accept
                byte flag = self.cache[0];

                // conn从100开始,如果为1,2,3则是特殊包
                uint  remoteConn      = 0;
                uint  localConn       = 0;
                ulong remotelocalConn = 0;
                try
                {
                    switch (flag)
                    {
                    //此处映射gate过来的消息发给哪个客户端
                    case KcpProtocalType.ACK:     // accept
                    case KcpProtocalType.RouterReconnectAck:
                        if (messageLength < 9)
                        {
                            break;
                        }
                        remoteConn      = BitConverter.ToUInt32(self.cache, 1);
                        localConn       = BitConverter.ToUInt32(self.cache, 5);
                        remotelocalConn = ((ulong)localConn << 32) | remoteConn;
                        if (self.OuterRouterService.GetACK(localConn, remoteConn))
                        {
                            self.OuterRouterService.SendToClient(remotelocalConn, messageLength, self.cache);
                        }
                        break;

                    case KcpProtocalType.MSG:
                        if (messageLength < 9)
                        {
                            break;
                        }
                        remoteConn      = BitConverter.ToUInt32(self.cache, 1);
                        localConn       = BitConverter.ToUInt32(self.cache, 5);
                        remotelocalConn = ((ulong)localConn << 32) | remoteConn;
                        if (!self.OuterRouterService.SendToClient(remotelocalConn, messageLength, self.cache))
                        {
                            //todo: 这里发送失败的话应该主动给服务端发一条FIN消息.免得服务端继续发消息
                            Log.Debug("Router MSG error:not found client:" + remotelocalConn);
                        }
                        break;

                    case KcpProtocalType.FIN:     // 断开
                        if (messageLength < 9)
                        {
                            break;
                        }
                        remoteConn      = BitConverter.ToUInt32(self.cache, 1);
                        localConn       = BitConverter.ToUInt32(self.cache, 5);
                        remotelocalConn = ((ulong)localConn << 32) | remoteConn;
                        self.OuterRouterService.SendToClient(remotelocalConn, messageLength, self.cache);
                        self.OuterRouterService.RemoveClientAddress(remotelocalConn);
                        break;
                    }
                }
                catch (Exception e)
                {
                    Log.Error($"RouterService error: {flag} {remoteConn} {localConn}\n{e}");
                }
            }
        }
        private static IPEndPoint CloneAddress(this RouterServiceInnerComponent self)
        {
            IPEndPoint ip = (IPEndPoint)self.ipEndPoint;

            return(new IPEndPoint(ip.Address, ip.Port));
        }
 public static void Destroy(this RouterServiceInnerComponent self)
 {
     self.socket.Close();
     self.socket = null;
 }
 public static void Update(this RouterServiceInnerComponent self)
 {
     self.Recv();
 }
 public static void SendToGate(this RouterServiceInnerComponent self, byte[] buffer, int length, IPEndPoint inneraddress)
 {
     self.socket.SendTo(buffer, 0, length, SocketFlags.None, inneraddress);
 }