Beispiel #1
0
        // запуск сервера
        public Server(int Port)
        {
            Console.WriteLine("Initialization...");

            Console.Title = Properties.Settings.Default.Title.Trim() + " (Control-X to stop)";

            System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(Protocol).TypeHandle);

            DbConnect DbConnect = DbConnect.CreateConnection();

            DbConnect.OpenConnection();
            DbConnect.CloseConnection();

            Listener = new TcpListener(IPAddress.Any, Port);
            Listener.Server.ReceiveTimeout = Properties.Settings.Default.TcpTimeout;
            Listener.Server.SendTimeout    = Properties.Settings.Default.TcpTimeout;
            Listener.Start();

            Console.WriteLine("Listening...");

            while (true)
            {
                if (Console.KeyAvailable)
                {
                    ConsoleKeyInfo KeyInfo = Console.ReadKey(true);

                    if (KeyInfo.Key == ConsoleKey.X && KeyInfo.Modifiers == ConsoleModifiers.Control)
                    {
                        break;
                    }
                }

                if (Listener.Pending())
                {
                    //Thread Thread = new Thread(StartClient);
                    ////Thread.IsBackground = true;
                    //Thread.Start(Listener.AcceptTcpClient());

                    ThreadPool.QueueUserWorkItem(new WaitCallback(StartClient), Listener.AcceptTcpClient());
                }
            }

            Console.WriteLine("Finishing...");

            if (Listener != null)
            {
                Listener.Stop();
            }

            while (true)
            {
                int maxWorkerThreads, maxIOThreads;
                int availableWorkerThreads, availableIOThreads;

                ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxIOThreads);
                ThreadPool.GetAvailableThreads(out availableWorkerThreads, out availableIOThreads);

                if (maxWorkerThreads == availableWorkerThreads)
                {
                    break;
                }

                System.Threading.Thread.Sleep(Properties.Settings.Default.TcpTimeout / 10);
            }
        }
Beispiel #2
0
        public Client(TcpClient Client)
        {
            byte[] Buffer = new byte[Constant.BufferSize];

            IncomingPacket IncomingPacket;
            OutgoingPacket OutgoingPacket;

            int Count;

            try
            {
                DbConnect = DbConnect.CreateConnection();

                DbConnect.OpenConnection();

                while (true)
                {
                    // новый входящий пакет
                    IncomingPacket = new IncomingPacket();

                    // получаем префикс
                    Count = Client.GetStream().Read(Buffer, 0, Constant.PrefixSize);
                    if (Count < Constant.PrefixSize)
                    {
                        throw new Exception("Prefix read error");
                    }

                    // декодируем префикс
                    IncomingPacket.DecodePrefix(Buffer);
                    // записываем префикс в базу
                    IncomingPacket.WritePrefix(DbConnect);

                    // получаем блоки данных
                    Count = Client.GetStream().Read(Buffer, Constant.PrefixSize, IncomingPacket.Size - Constant.PrefixSize);
                    if (Count < IncomingPacket.Size - Constant.PrefixSize)
                    {
                        throw new Exception("Packet read error");
                    }

                    // разбиваем буфер на блоки
                    IncomingPacket.DecodeData(Buffer);
                    // декодируем блоки и записываем данные блоков в базу
                    IncomingPacket.WriteData(DbConnect);

                    // новый исходящий пакет
                    OutgoingPacket = new OutgoingPacket(IncomingPacket);

                    // записываем данные для тестового запроса
                    //OutgoingPacket.WriteTest(DbConnect);
                    // читаем данные для запроса, ищем подходящую квитанцию, кодируем запрос
                    OutgoingPacket.ReadData(DbConnect);

                    // кодируем квитанцию и помещаем результат в буфер
                    OutgoingPacket.EncodeData(Buffer);
                    // кодируем префикс и помещаем результат в буфер
                    OutgoingPacket.EncodePrefix(Buffer);

                    // отправляем исходящий пакет
                    Client.GetStream().Write(Buffer, 0, OutgoingPacket.Size);

                    // отмечаем отправленный запрос
                    OutgoingPacket.WriteData(DbConnect, 2);
                }
            }
            catch (Exception e)
            {
                if (e.HResult == Constant.ExceptionDisconnect)
                {
                    // не ошибка
                }
                else if (e.HResult == Constant.ExceptionCRC)
                {
                    Console.WriteLine(e.Message);
                }
                else
                {
                    Console.WriteLine(e.Message);
                }
            }

            try
            {
                DbConnect.CloseConnection();

                Client.Close();

                //Console.WriteLine("Client disconnected");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }