예제 #1
0
        private void DataProc(newCLient sender, HeaderDsc header, byte[] data)
        {
            switch (header.Message)
            {
            case ServiceMessage.file:     // получение файла

                FilePr file = new FilePr();
                string path = "123" + header.ext;
                File.WriteAllBytes(path, data);
                if (!(file.CheckSum(path) == header.Hex))
                {
                    Console.WriteLine("file damaged");                                           // проверка целостности файла
                }
                break;

            case ServiceMessage.data:
                break;

            case ServiceMessage.Authorization:     // подключение
                newUserAv(sender);
                Console.WriteLine("Authorization message from ");
                Console.WriteLine(sender.settings.guid);
                break;

            case ServiceMessage.Server:     // подключение серверного приложения
                sender.clientState = 1;
                Console.WriteLine("///server app connected\n");
                List <ClSpec> listCl = new List <ClSpec>();  // формирование перечисления описаний клиентов
                foreach (newCLient cl in ClientList)
                {
                    if (cl.clSpec.settings == null)
                    {
                        cl.clSpec.settings = new xmlSettings.XmlSet();
                    }
                    listCl.Add(cl.clSpec);
                }
                byte[] clList;
                using (MemoryStream Memory = new MemoryStream())     // сериализация перечисления
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(Memory, listCl);
                    Memory.Position = 0;
                    clList          = new byte[Memory.Length];
                    var r = Memory.Read(clList, 0, clList.Length);
                }
                sender.SendCl(ServiceMessage.clList, this.guid, clList, 0);
                break;

            case ServiceMessage.cmd:         // комманда коммандной строки
                if (sender.clientState == 1) // если сообщение получено от серверного приложения
                {
                    Console.WriteLine("cmd get from serv app\n");
                    try
                    {
                        Cmd cmd = new Cmd();
                        using (MemoryStream Memory = new MemoryStream(header.DataSize))     // десериализация заголовка
                        {
                            Memory.Write(data, 0, data.Length);
                            Memory.Position = 0;

                            BinaryFormatter bf = new BinaryFormatter();
                            cmd = (Cmd)bf.Deserialize(Memory);
                        }
                        foreach (Guid guid in cmd.list)     // поиск выбранных клиентов
                        {
                            foreach (newCLient cl in ClientList)
                            {
                                if (cl.clSpec.settings == null)
                                {
                                    ;
                                }
                                else
                                {
                                    if (cl.clSpec.settings.guid == guid)
                                    {
                                        byte[] str = Encoding.Default.GetBytes(cmd.strCmd);
                                        cl.Send(ServiceMessage.cmd, this.guid, str);
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)    // отправка ошибки на серверное приложение
                    {
                        string erMsg = ex.ToString() + " SERVER EXCEPTION WHILE SENDING CMD";
                        sender.Send(ServiceMessage.error, guid, Encoding.Default.GetBytes(erMsg));
                    }
                }
                else     // если это ответ от клиента
                {
                    Console.WriteLine("cmd response get from" + sender.tcpClient.ToString());
                    foreach (newCLient client in ClientList)
                    {
                        if (client.clientState == 1)
                        {
                            client.Send(ServiceMessage.cmd, guid, data);
                        }
                    }
                }
                break;

            case ServiceMessage.servCommand:
                break;

            case ServiceMessage.clCommand:
                clientSendCommand(sender, header, data);
                break;
            }
        }