Пример #1
0
        public void MessageChat(DataCover128kb data)
        {
            MessageChat mc = Protocol.BufferToObject <MessageChat>(data.Data);
            string      mess;

            if (mc.TypeSender == SendrType.server)
            {
                mess = "SERVER\n";
            }
            else
            {
                string name = "unknown";
                if (mc.TypeSender == SendrType.terminal)
                {
                    _TerminalModel.DispatcherInvokeModel((x) => name = x.ConnectedTermenals.FirstOrDefault(xx => xx.Id == mc.Id)?.Name);
                }
                else if (mc.TypeSender == SendrType.remote_device)
                {
                    _TerminalModel.DispatcherInvokeModel((x) => name = x.ConnectedDevices.FirstOrDefault(xx => xx.Id == mc.Id)?.Name);
                }

                mess = $"id{Id.Value}:{name}:{mc.TypeSender}\n";
            }
            mess += mc.Text;
            LogWriter.SendLog(mess);
            _TerminalModel.AddChatMessage(mess);
        }
Пример #2
0
        private void SessionInf(DataCover128kb data)
        {
            TerminalConnectData tcd = Protocol.BufferToObject <TerminalConnectData>(data.Data);

            SessionData sd = ClientsControl.GetSessions().FirstOrDefault(x => x.RemDevGuid.SequenceEqual(tcd.RemDevGuid) && x.TerminalGuid.SequenceEqual(tcd.TerminalGuid));

            if (tcd.IsEnabled)
            {
                if (sd != null)
                {
                    sd.UpdateInfoToClients();
                }
                else
                {
                    ClientsControl.AddSession(new SessionData(tcd.TerminalGuid, tcd.RemDevGuid));
                }
            }
            else
            {
                if (sd != null)
                {
                    ClientsControl.RemoveSession(sd);
                }
            }
        }
Пример #3
0
        public void SessionInf(DataCover128kb data)
        {
            SessionInfo si   = Protocol.BufferToObject <SessionInfo>(data.Data);
            string      mess = string.Empty;

            _TerminalModel.DispatcherInvokeModel(x =>
            {
                if (si.Infotype == SessionMessageType.SesInformation || si.Infotype == SessionMessageType.SesCreateNow)
                {
                    SessionView sv = x.ConnectedSessions.FirstOrDefault(xx => xx.Id == si.SessionId);
                    if (sv == null)
                    {
                        x.ConnectedSessions.Add(new SessionView(si.SessionId, si.TerminalId, si.RemDevId, this, _TerminalModel));
                    }
                    else
                    {
                        sv.UpdateIds(si.TerminalId, si.RemDevId);
                    }
                    mess = $"Сессия id{si.SessionId} создана, terminal:id{si.TerminalId}, remote_device:id{si.RemDevId}";
                }
                else if (si.Infotype == SessionMessageType.SesShutdownNow || si.Infotype == SessionMessageType.SesLost)
                {
                    x.ConnectedSessions.Remove(x.ConnectedSessions.FirstOrDefault(xx => xx.Id == si.SessionId));
                    mess = $"Сессия id{si.SessionId} прервана, terminal:id{si.TerminalId}, remote_device:id{si.RemDevId}";
                }
            });
            if (si.Infotype == SessionMessageType.SesCreateNow || si.Infotype == SessionMessageType.SesShutdownNow)
            {
                LogWriter.SendLog(mess);
                _TerminalModel.AddChatMessage(mess);
            }
        }
Пример #4
0
 private static void addTerminal(Terminal t)
 {
     if (t.IsConnect)
     {
         byte[] bufer = new DataCover128kb(new ConnectedClientsInfo(t.Name, t.Id.Value, ClientInfoConnect.ConnectNow, ClientType.terminal).Pack(), DataType.connectedClientsInfo).Pack();
         Terminals.Add(t);
         foreach (Terminal term in Terminals)
         {
             term.Write(bufer);
             byte[] buf = new DataCover128kb(new ConnectedClientsInfo(term.Name, term.Id.Value, ClientInfoConnect.ClientInf, ClientType.terminal).Pack(), DataType.connectedClientsInfo).Pack();
             if (term.Id.Value != t.Id.Value)
             {
                 t.Write(buf);
             }
         }
         foreach (RemoteDevice rd in Devices)
         {
             byte[] buf = new DataCover128kb(new ConnectedClientsInfo(rd.Name, rd.Id.Value, ClientInfoConnect.ClientInf, ClientType.remote_device).Pack(), DataType.connectedClientsInfo).Pack();
             t.Write(buf);
         }
         foreach (SessionData sd in Sessions)
         {
             byte[] buf = new DataCover128kb(new SessionInfo(sd.Id, sd.GetTerminalId(Terminals), sd.GetRemoteDevId(Devices), SessionMessageType.SesInformation).Pack(), DataType.sessionInfo).Pack();
             t.Write(buf);
         }
         LogWriter.SendLog($"Подключен терминал {t.Name}, присвоен id {t.Id.Value}");
     }
 }
Пример #5
0
        public void AssignedID(DataCover128kb data)
        {
            int id = Protocol.BufferToObject <ValInt32>(data.Data).Value;

            Id.Value = id;
            LogWriter.SendLog("Присвоен id " + Id.ToString());
            _TerminalModel.OnPropertyChanged("Title");
        }
Пример #6
0
 public static void SendGlobalChat(string mess)
 {
     byte[] buf = new DataCover128kb(new MessageChat(-1, SendrType.server, mess).Pack(), DataType.messageChat).Pack();
     foreach (Terminal t in GetTerminals())
     {
         t.Write(buf);
     }
 }
Пример #7
0
        public override void AceptMessage(DataCover128kb data)
        {
            base.AceptMessage(data);

            switch (data.BufferType)
            {
            case DataType.requistCreateSession: Session(data); break;
            }
        }
Пример #8
0
        public override void AceptMessage(DataCover128kb data)
        {
            base.AceptMessage(data);

            switch (data.BufferType)
            {
            case DataType.ping: PingInfo(); break;
            }
        }
Пример #9
0
        public override void AceptMessage(DataCover128kb data)
        {
            switch (data.BufferType)
            {
            case DataType.messageChat: MessageChat(data); break;

            case DataType.sessionInfo: SessionInf(data); break;
            }
        }
Пример #10
0
        public void TryConnectToRemDev(DataCover128kb data)
        {
            ConnectedInfo ci = Protocol.BufferToObject <ConnectedInfo>(data.Data);

            _TerminalModel.TWMV.Dispatcher.Invoke(() =>
            {
                SessionStarter st = new SessionStarter((IPEndPoint)Client.LocalEndPoint, new IPEndPoint(new IPAddress(ci.Ip), ci.Port), ci.Pass, _TerminalModel);
                st.Show();
            });
        }
Пример #11
0
        public void PingInfo()
        {
            long ping = Ping;

            byte[] data = new DataCover128kb(new СonnectionQuality(Id.Value, ping, ClientType.remote_device).Pack(), DataType.connectionQuality).Pack();
            foreach (Terminal t in ClientsControl.GetTerminals())
            {
                t.Write(data);
            }
        }
Пример #12
0
        public void UpdateInfoToClients()
        {
            int idt = GetTerminalId(ClientsControl.GetTerminals());
            int idr = GetRemoteDevId(ClientsControl.GetDevices());

            byte[] data = new DataCover128kb(new SessionInfo(Id, idt, idr, SessionMessageType.SesInformation).Pack(), DataType.sessionInfo).Pack();
            foreach (Terminal term in ClientsControl.GetTerminals())
            {
                term.Write(data);
            }
        }
Пример #13
0
        public override void AceptMessage(DataCover128kb data)
        {
            switch (data.BufferType)
            {
            case DataType.ping: UpdateServerPing(); break;

            case DataType.assignedID: aceptRemdevId(data); break;

            default: break;
            }
        }
Пример #14
0
        private void ClosingClient()
        {
            SessionModel.RemoveSessions(_SessionModel);
            if (_SessionModel._SessionW._TerminalModel.TerminalClie__t != null && _SessionModel._SessionW._TerminalModel.TerminalClie__t.IsConnect)
            {
                byte[] data = new DataCover128kb(new TerminalConnectData(MainWindow.TerminalGuid, RemotelGuid, false).Pack(), DataType.sessionInfo).Pack();
                _SessionModel._SessionW._TerminalModel.TerminalClie__t.Write(data);
            }

            LogWriter.SendLog($"Соединение с удаленным устройством {_SessionModel.Title} прервано.", ConsoleColor.Red, true);
            _SessionModel.DispatcherInvokeSessionW((x) => x.Close());
        }
Пример #15
0
        protected void MessageChat(DataCover128kb data)
        {
            MessageChat mc   = Protocol.BufferToObject <MessageChat>(data.Data);
            string      mess = $"[{DateTime.Now}]:id{Id.Value}:{Name}:{mc.TypeSender}\n{mc.Text}";

            LogWriter.SendLog(mess);
            byte[] buf = data.Pack();
            foreach (Terminal t in ClientsControl.GetTerminals())
            {
                t.Write(buf);
            }
        }
Пример #16
0
        public ClientObj(Socket c, string name, byte[] clientGuid) : base(c)
        {
            ClientGuid = clientGuid;

            Name     = name;
            Id.Value = nextId;
            nextId  += 1;

            ValInt32       vi32  = new ValInt32(Id.Value);
            DataCover128kb dc128 = new DataCover128kb(vi32.Pack(), DataType.assignedID);

            Write(dc128);
        }
Пример #17
0
        public TerminalClient(Socket c, TerminalModel tm) : base(c)
        {
            _TerminalModel         = tm;
            EventAfterCloseClient += ClosingClient;

            foreach (SessionModel sc in SessionModel.GetSessions())
            {
                if (sc._SessionClient.IsConnect)
                {
                    byte[] data = new DataCover128kb(new TerminalConnectData(MainWindow.TerminalGuid, sc._SessionClient.RemotelGuid, true).Pack(), DataType.sessionInfo).Pack();
                    Write(data);
                }
            }
        }
Пример #18
0
        private static void addDevice(RemoteDevice t)
        {
            if (t.IsConnect)
            {
                Devices.Add(t);
                byte[] bufer = new DataCover128kb(new ConnectedClientsInfo(t.Name, t.Id.Value, ClientInfoConnect.ConnectNow, ClientType.remote_device).Pack(), DataType.connectedClientsInfo).Pack();
                foreach (Terminal term in Terminals)
                {
                    term.Write(bufer);
                }

                LogWriter.SendLog($"Подключено удаленное устройство {t.Name}, присвоен id {t.Id.Value}");
            }
        }
Пример #19
0
        public SessionClient(Socket c, SessionModel sm, byte[] remotelGuid) : base(c)
        {
            RemotelGuid = remotelGuid;

            _SessionModel = sm;

            if (_SessionModel._SessionW._TerminalModel.TerminalClie__t != null && _SessionModel._SessionW._TerminalModel.TerminalClie__t.IsConnect)
            {
                byte[] data = new DataCover128kb(new TerminalConnectData(MainWindow.TerminalGuid, RemotelGuid, true).Pack(), DataType.sessionInfo).Pack();
                _SessionModel._SessionW._TerminalModel.TerminalClie__t.Write(data);
            }

            EventAfterCloseClient += ClosingClient;
        }
Пример #20
0
        private static void removeSession(SessionData t)
        {
            if (Sessions.Remove(t))
            {
                int    idt   = t.GetTerminalId(Terminals);
                int    idr   = t.GetRemoteDevId(Devices);
                byte[] dc128 = new DataCover128kb(new SessionInfo(t.Id, idt, idr, SessionMessageType.SesShutdownNow).Pack(), DataType.sessionInfo).Pack();
                foreach (Terminal te in Terminals)
                {
                    te.Write(dc128);
                }

                LogWriter.SendLog($"Cессия более не зарегестрирована {t.Id}:{idt}:{idr}");
            }
        }
Пример #21
0
        private static void addSession(SessionData t)
        {
            Sessions.Add(t);

            int idt = t.GetTerminalId(Terminals);
            int idr = t.GetRemoteDevId(Devices);

            byte[] dc128 = new DataCover128kb(new SessionInfo(t.Id, idt, idr, SessionMessageType.SesCreateNow).Pack(), DataType.sessionInfo).Pack();
            foreach (Terminal te in Terminals)
            {
                te.Write(dc128);
            }

            LogWriter.SendLog($"Создана новая сессия {t.Id}:{idt}:{idr}");
        }
Пример #22
0
        private bool registrationProcess(Socket client, ConfigView conf)
        {
            client.ReceiveTimeout = 1000;
            RegistrationData rd = new RegistrationData(conf.Name, conf.Login, conf.Pass, TerminalGuid, ClientType.terminal);
            DataCover128kb   dc = new DataCover128kb(rd.Pack(), DataType.registrationRequist);

            byte[] rdbytes = dc.Pack();
            client.Send(rdbytes, 0, rdbytes.Length, SocketFlags.None);

            byte[] bufer = new byte[Protocol.CoverSize];
            Protocol.ReadStream(client, bufer, 0, bufer.Length);

            Cover report = Protocol.BufferToObject <Cover>(bufer);

            return(report.BufferType == DataType.registrationComlited);
        }
Пример #23
0
        private static void tryLostSession(SessionData t)
        {
            int idt = t.GetTerminalId(Terminals);
            int idr = t.GetRemoteDevId(Devices);

            if (idt == -1 && idr == -1 && Sessions.Remove(t))
            {
                byte[] dc128 = new DataCover128kb(new SessionInfo(t.Id, idt, idr, SessionMessageType.SesLost).Pack(), DataType.sessionInfo).Pack();
                foreach (Terminal te in Terminals)
                {
                    te.Write(dc128);
                }

                LogWriter.SendLog($"Cессия вышла из зоны видимости {t.Id}:{idt}:{idr}");
            }
        }
Пример #24
0
        private bool registration(Socket s)
        {
            try
            {
                SendStatus($"Процесс авторизации");
                s.ReceiveTimeout = 3000;

                byte[] regData = new DataCover128kb(new TerminalRegRemDev(MainWindow.TerminalGuid, Pass, MainWindow.CW.Name).Pack(), DataType.registrationRequist).Pack();
                s.Send(regData, 0, regData.Length, SocketFlags.None);

                byte[] coverBuf = new byte[Protocol.CoverSize];
                Protocol.ReadStream(s, coverBuf, 0, coverBuf.Length);

                Cover cov = Protocol.BufferToObject <Cover>(coverBuf);
                if (cov.BufferType == DataType.registrationComlited)
                {
                    byte[] dataCovBuf = new byte[cov.DataSize];
                    //Array.Copy(coverBuf, dataCovBuf, Protocol.CoverSize);

                    Protocol.ReadStream(s, dataCovBuf, 0, cov.DataSize);
                    TerminalRegRemDev result = Protocol.BufferToObject <TerminalRegRemDev>(dataCovBuf);

                    if (result.Pass.SequenceEqual(Pass))
                    {
                        remdevName = result.SenderName;
                        remdevGuid = result.SenderGuid;

                        SendStatus($"Авторизация произведена");
                        SendStatus($"Соединение с {remdevName} успешно установлено");
                        return(true);
                    }
                    else
                    {
                        throw new Exception("Регистрационные данные не верны");
                    }
                }
                else
                {
                    throw new Exception("Принят не верный ответ от удаленного устройства");
                }
            }
            catch (Exception e)
            {
                SendStatus(e.Message, ConsoleColor.Red);
                return(false);
            }
        }
Пример #25
0
        public void ConnectedClientInfo(DataCover128kb data)
        {
            ConnectedClientsInfo cci = Protocol.BufferToObject <ConnectedClientsInfo>(data.Data);
            string mess = string.Empty;

            _TerminalModel.DispatcherInvokeModel((x) =>
            {
                if (cci.TypeClient == ClientType.terminal)
                {
                    if (cci.Connect == ClientInfoConnect.ConnectNow || cci.Connect == ClientInfoConnect.ClientInf)
                    {
                        _TerminalModel.ConnectedTermenals.Add(new TerminalClientView(cci.Id, cci.Name, this, _TerminalModel));
                        mess = $"Подключен терминал {cci.Name}, присвоен id {cci.Id}";
                    }
                    else
                    {
                        foreach (TerminalClientView c in new List <TerminalClientView>(_TerminalModel.ConnectedTermenals.Where(xx => xx.Id == cci.Id)))
                        {
                            _TerminalModel.ConnectedTermenals.Remove(c);
                        }
                        mess = $"Терминал {cci.Name} отключен, id {cci.Id}";
                    }
                }
                else if (cci.TypeClient == ClientType.remote_device)
                {
                    if (cci.Connect == ClientInfoConnect.ConnectNow || cci.Connect == ClientInfoConnect.ClientInf)
                    {
                        _TerminalModel.ConnectedDevices.Add(new RemoteDevClientView(cci.Id, cci.Name, this, _TerminalModel));
                        mess = $"Подключено удаленное устройство {cci.Name}, присвоен id {cci.Id}";
                    }
                    else
                    {
                        foreach (RemoteDevClientView c in new List <RemoteDevClientView>(_TerminalModel.ConnectedDevices.Where(xx => xx.Id == cci.Id)))
                        {
                            _TerminalModel.ConnectedDevices.Remove(c);
                        }
                        mess = $"Удаленное устройство {cci.Name} отключено, id {cci.Id}";
                    }
                }
            });
            if (cci.Connect != ClientInfoConnect.ClientInf)
            {
                LogWriter.SendLog(mess);
                _TerminalModel.AddChatMessage(mess);
            }
        }
Пример #26
0
        public void ConnectQuality(DataCover128kb data)
        {
            СonnectionQuality cq = Protocol.BufferToObject <СonnectionQuality>(data.Data);

            if (cq.Cli_ntType == ClientType.remote_device)
            {
                _TerminalModel.DispatcherInvokeModel(x =>
                {
                    RemoteDevClientView rd = null;
                    rd = x.ConnectedDevices.FirstOrDefault(xx => xx.Id == cq.ClientId);
                    if (rd != null)
                    {
                        rd.Ping = cq.Ping;
                    }
                });
            }
        }
Пример #27
0
        public override void AceptMessage(DataCover128kb data)
        {
            switch (data.BufferType)
            {
            case DataType.ping: UpdateServerPing(); break;

            case DataType.connectionQuality: ConnectQuality(data); break;

            case DataType.assignedID: AssignedID(data); break;

            case DataType.connectedClientsInfo: ConnectedClientInfo(data); break;

            case DataType.messageChat: MessageChat(data); break;

            case DataType.sessionInfo: SessionInf(data); break;

            case DataType.createSessionIpPort: TryConnectToRemDev(data); break;
            }
        }
Пример #28
0
        private static void removeDevice(RemoteDevice t)
        {
            t.CloseClient();

            if (Devices.Remove(t))
            {
                byte[] bufer = new DataCover128kb(new ConnectedClientsInfo(t.Name, t.Id.Value, ClientInfoConnect.DisconectNow, ClientType.remote_device).Pack(), DataType.connectedClientsInfo).Pack();
                foreach (Terminal term in Terminals)
                {
                    term.Write(bufer);
                }
                LogWriter.SendLog($"Удаленное устройство {t.Name} отключено, id {t.Id.Value}");

                SessionData sd = Sessions.FirstOrDefault(x => x.RemDevGuid.SequenceEqual(t.ClientGuid));
                if (sd != null)
                {
                    tryLostSession(sd);
                }
            }
        }
Пример #29
0
        public static void removeTerminal(Terminal t)
        {
            t.CloseClient();

            if (Terminals.Remove(t))
            {
                byte[] bufer = new DataCover128kb(new ConnectedClientsInfo(t.Name, t.Id.Value, ClientInfoConnect.DisconectNow, ClientType.terminal).Pack(), DataType.connectedClientsInfo).Pack();
                foreach (Terminal term in Terminals)
                {
                    term.Write(bufer);
                }
                LogWriter.SendLog($"Терминал {t.Name} отключен, id { t.Id.Value}");

                SessionData sd = Sessions.FirstOrDefault(x => x.TerminalGuid.SequenceEqual(t.ClientGuid));
                if (sd != null)
                {
                    tryLostSession(sd);
                }
            }
        }
Пример #30
0
        public void Session(DataCover128kb data)
        {
            CreateSession si = Protocol.BufferToObject <CreateSession>(data.Data);
            RemoteDevice  rd = ClientsControl.GetDevices().FirstOrDefault(x => x.Id.Value == si.RemDevId);

            if (rd != null)
            {
                string text = $"Запрос создания сессии id{Id.Value}:{Name} id{rd.Id.Value}:{rd.Name}";
                LogWriter.SendLog(text);
                ClientsControl.SendGlobalChat(text);

                byte[]   ip      = new byte[4];
                int      port    = si.CustomPort;
                string[] ipstrar = null;
                if (port > -1)
                {
                    ipstrar = Program.GLOBALIP.Split('.');
                }
                else
                {
                    IPEndPoint ipep = (IPEndPoint)Client.RemoteEndPoint;
                    ipstrar = ipep.Address.ToString().Split('.');
                    port    = ipep.Port;
                }
                for (int i = 0; i < ip.Length; i += 1)
                {
                    ip[i] = byte.Parse(ipstrar[i]);
                }

                byte[] pass = Guid.NewGuid().ToByteArray();

                rd.Write(new DataCover128kb(new ConnectedInfo(ip, port, pass).Pack(), DataType.createSessionIpPort).Pack());
                Write(new DataCover128kb(new ConnectedInfo(((IPEndPoint)rd.Client.RemoteEndPoint).Address.GetAddressBytes(), ((IPEndPoint)rd.Client.RemoteEndPoint).Port, pass).Pack(), DataType.createSessionIpPort).Pack());
            }
            else
            {
                string text = $"В запросе создания сессии для {Id.Value}:{Name} отказано, удаленное устройство id:{si.RemDevId} не подключено";
                LogWriter.SendLog(text);
                ClientsControl.SendGlobalChat(text);
            }
        }