private void HandleMarketmakerThread(object obj)
        {
            TcpClient client = obj as TcpClient;

            while (true)
            {
                //получаем команду, парсим и ставим в очередь
                string received = SocketIO.Read(client);

                Console.WriteLine(DateTime.Now + " MARKETMAKER: received " + received);

                if (received == "dc")
                {
                    break;
                }

                string[] json_fcs = received.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

                for (int i = 0; i < json_fcs.Length; i++)
                {
                    //JSON-парсинг вызова функции ядра
                    int      func_id;
                    string[] str_args;
                    bool     _parsed = JsonManager.ParseTechJson(json_fcs[i], out func_id, out str_args);

                    if (_parsed)
                    {
                        Console.WriteLine(DateTime.Now + " MARKETMAKER: to queue function #" + func_id);
                        MarketmakerRequest.QueueFC(client, func_id, str_args); //попытка парсинга аргументов и постановки в очередь соответствующей функции
                    }
                    else //ошибка JSON-парсинга
                    {
                        CoreResponse.RejectInvalidJson(client);
                    }
                }
            }

            client.Close();
            Console.WriteLine(DateTime.Now + " MARKETMAKER: connection closed");
        }
 internal static void RejectInvalidFuncArgs(TcpClient client)
 {
     SocketIO.Write(client, JsonManager.FormTechJson((int)StatusCodes.ErrorInvalidFunctionArguments));
     Console.WriteLine(DateTime.Now + " CORE: [invalid arguments provided]");
 }
 internal static void AcceptFC(TcpClient client, long func_call_id) //запрос успешно обработан и будет поставлен в очередь
 {
     SocketIO.Write(client, JsonManager.FormTechJson((int)StatusCodes.Success, func_call_id));
     Console.WriteLine(DateTime.Now + " CORE: accepted call #" + func_call_id);
 }
 internal static void RejectMarketClosed(TcpClient client) //отклонение запроса из-за приостановки торгов
 {
     SocketIO.Write(client, JsonManager.FormTechJson((int)StatusCodes.ErrorMarketClosed));
     Console.WriteLine(DateTime.Now + " CORE: [market closed]");
 }
 internal static void RejectInvalidJson(TcpClient client) //отклонение запроса из-за невалидного JSON
 {
     SocketIO.Write(client, JsonManager.FormTechJson((int)StatusCodes.ErrorInvalidJsonInput));
     Console.WriteLine(DateTime.Now + " CORE: [tech JSON parse failed]");
 }
 internal static void RejectFuncNotFound(TcpClient client) //отклонение запроса из-за отсутствия функции в ядре
 {
     SocketIO.Write(client, JsonManager.FormTechJson((int)StatusCodes.ErrorFunctionNotFound));
     Console.WriteLine(DateTime.Now + " CORE: [function not found]");
 }