Просмотр сообщений
|
Страниц: [1] 2 3 ... 140
|
1
|
Qt / Qt Embedded / Файловая система на embedded
|
: Июль 15, 2024, 12:48
|
Доброго времени суток, коллеги! Суть проблемы следующая. На железке стоит внешняя флешка FLASH MX25l6433f: Sector = 4095 byte Block = 8 sectors (32KB) Page = 2 blocks (64KB) Chip = 128 pages (8MB) Назрела необходимость написать под неё файловую систему. Чего хотелось бы из коробки - это поддержка циркулярных буферов, максимально равномерное использование секторов (число операций перезаписи ограниченно ~ 10^5 циклов) Ну и скорость и размер, разумеется) Вначале выбор пал на littlefs https://github.com/littlefs-project/littlefs, но после более близкого знакомства с ней, хочется поскорее забыть о ней) Собственно, коллеги, посоветуйте, поделитесь опытом или соображениями в каком направлении курить и куда лучше копать? Сейчас склоняюсь написать свою ФС с нуля..
|
|
|
5
|
Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll)
|
: Январь 31, 2024, 13:38
|
и все это надо сделать как тестовое задание ? )
Ну да) Вот полный текст Разработать на C++ TCP прокси-сервер для СУБД Postgresql с возможностью логирования всех SQL запросов, проходящих через него. Документация по сетевому протоколу этой СУБД доступна на официальном сайте. Для выполнения тестового задания нужно использовать Berkley sockets (select/poll/epoll). Прочих зависимостей быть не должно. Прокси должен уметь обрабатывать большое количество соединений без создания потока (thread) на каждое соединение. Необходимо распарсить сетевые пакеты, проходящие через прокси, в которых содержатся SQL запросы, извлечь эти запросы из пакетов и записать их в файл в виде текста (по одному запросу в строке, структура неважна). Для того, чтобы в прокси были видны SQL запросы в незашифрованном виде, необходимо отключить SSL (на клиенте и/или сервере). Должна присутствовать минимальная обработка ошибок, так же желательны комментарии в тех местах, где возможны ошибки. Приложение не должно падать на нескольких десятках одновременных соединений, выполняющих запросы к СУБД без перерыва в течение 5 минут (можно использовать sysbench для тестирования). Операционная система Linux, компилятор – GCC, так же необходимо создать файл для сборки проекта с помощью cmake или make. Цель выполнения тестового задания – проверка профессиональных навыков кандидатов на вакантную позицию. Написанный Вами код не будет использоваться в продуктах компании или передан третьим лицам. Результат выполнения тестового задания можно выложить на github.com под любой лицензией во избежание использования Вашего кода.
|
|
|
6
|
Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll)
|
: Январь 31, 2024, 10:55
|
Прочитал очередную порцию данный (chunk) добавил к общему буферу. А дальше уже смотришь, если в общем буфере получена команда полностью (от SELECT и до ';'), то выкусываем ее из буфера и обрабатываем, иначе ждем оочередной чанк.
никак - tcp потоковый протокол для этих целей делают логический пакет "[размер][данные]"
Понятно) Спасибо) сегодня будет чем заняться)
|
|
|
7
|
Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll)
|
: Январь 31, 2024, 10:41
|
А если запрос получен не полностью? Например, получили только "SELECT * FRO" а остаток прилетит позже?
Значит нужен какой то признак того, что данные полученны не полностью/полностью.. Я читаю данные в буфер C++ (Qt) char buffer[buff_size]; memset(buffer, 0, buff_size); int rc = recv(m_fds[i].fd, buffer, buff_size - 1, 0);
Как мне узнать, что ответ получен не полностью и ожидается продолжение?
|
|
|
8
|
Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll)
|
: Январь 31, 2024, 09:51
|
Дожидается ответа и шлёт ответ клиенту
теперь ясно ) а как решается проблема, что трафик между клиентом, например psql, и сервером - это не plain text и вычленить sql запросы не очевидно как ? Я пока предполагаю, что это просто plain text в котором могут быть sql запросы. Сейчас реализовано так: C++ (Qt) proxy.run(std::cout, [&](const std::string & data) { auto query_list = sandbox::get_sql_query(data); for (const auto & query : query_list) out << query << std::endl; });
где парсер просто извлекает из текста запросы: C++ (Qt) #ifndef SQL_PARSER_H #define SQL_PARSER_H #include <regex> #include <string> #include <list> namespace sandbox { inline std::list<std::string> get_sql_query(const std::string & src) { std::regex query_regex("(SELECT[^;]+;)"); auto query_begin = std::sregex_iterator(src.begin(), src.end(), query_regex); auto query_end = std::sregex_iterator(); std::regex r("\\n"); std::list<std::string> result; for (std::sregex_iterator i = query_begin; i != query_end; ++i) { std::smatch match = *i; result.push_back(std::regex_replace(match.str(), r, " ")); } return result; } } /* namespace sandbox */ #endif // SQL_PARSER_H
|
|
|
9
|
Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll)
|
: Январь 31, 2024, 09:14
|
Логика должна быть другой, на старте поднимается только сокет, который принимает подключения от клиентов. При подключении нового клиента, выполняем подключение к серверу и после этого имеем пару сокетов client-proxy и proxy-server, вот все что приходит по первому сокету, нужно отправить во второй и наоборот. Если один из сокетов закрывается, то нужно закрыть и второй. Как правило эти два сокета храняться в объектах, которые называют session. Согласен) По сути, m_remote_sd должен быть слушающим. Запускать poll и ждать событий POLLOUT от удалённого сервера.. Переделаю сегодня. Спасибо)
|
|
|
10
|
Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll)
|
: Январь 31, 2024, 08:17
|
а как сервер через прокси ответит нужному клиенту (о выполнении запроса) если он не знает кому ?
Ну по логике, сервер и не должен ничего знать о том, какой клиент отправил запрос. Его задача получить запрос, обработать и отправить ответ. Всю консолидацию данных между сервером и клиентами берёт на себя прокси. Сейчас сделано (возможно топорно) так: У прокси есть список активных клиентов. Он последовательно перебирает их, читает у каждого запрос, обрабатывает его и шлёт дальше на удалённый сервер. Дожидается ответа и шлёт ответ клиенту. Затем переходит к следующему в списке клиенту и т.д.. Здесь (в моей реализации), я подозреваю, есть слабое место: прокси должен дождаться ответа от сервера, прежде чем перекинуть серверу следующего клиента.. Здесь меня это смущает, конечно
|
|
|
11
|
Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll)
|
: Январь 30, 2024, 23:46
|
а почему m_remote_sd один ? если я правильно понял задачу - будет, например 10 клиентов к прокси, которая сделает 10 коннектов к БД
А одного m_remote_sd для этого достаточно. Прокси последовательно перебирает всех активных клиентов (событие POLLIN), читает данные от каждого, обрабатывает и пробрасывает их на remote_server (через сокет m_remote_sd)
|
|
|
13
|
Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll)
|
: Январь 30, 2024, 17:39
|
Вот этой части не нашел. В обработчике только вывод в cout.
Да, спасибо за замечание) Парсинг запросов я пока не делал. Этим будет заниматься C++ (Qt) data_handler
в методе run: C++ (Qt) void run(std::ostream & logger, const received_data_handler_t & data_handler);
В ТЗ сказано: Необходимо распарсить сетевые пакеты, проходящие через прокси, в которых содержатся SQL запросы, извлечь эти запросы из пакетов и записать их в файл в виде текста (по одному запросу в строке, структура неважна).
По идее SQL запросы необходимо собирать из сетевых пакетов. При этом пакеты могут неожиданно разрываться и слипаться между собой. Должен быть какой-то признак окончания запроса (м.б. символ";").
Вот. Займусь как раз этим вопросом) Эта тема для меня тоже пока новая
|
|
|
14
|
Qt / Работа с сетью / tcp proxy server. Только на berkley sockets (select/poll/epoll)
|
: Январь 30, 2024, 14:45
|
Доброго времени суток, коллеги!) На собеседовании дали тестовое задание разработать Tcp proxy server для Postgresql с возможностью логирования всех SQL запросов, проходящих через него. При этом нужно использовать Berkley sockets (select/poll/epoll). Прочих зависимостей быть не должно. Прокси должен уметь обрабатывать большое количество соединений без создания потока (thread) на каждое соединение. Необходимо распарсить сетевые пакеты, проходящие через прокси, в которых содержатся SQL запросы, извлечь эти запросы из пакетов и записать их в файл в виде текста (по одному запросу в строке, структура неважна). И т.д.. Тема для меня совсем новая, раньше сетевым программированием не занимался. Поэтому пришлось убить все выходные на расскуривание данного вопроса. Своял код (проект прилагаю). При реализации из select/poll/epoll выбор пал на poll. Если кому не сложно и кто в теме, покритикуйте пожалуйста. Может как то по элегантнее можно реализовать. Боюсь, у меня уже взгляд замыленный.. Заранее спасибо)
|
|
|
15
|
Разное / Говорилка / Re: Регистрация программы в Росреестре
|
: Январь 18, 2024, 12:57
|
Коллеги, прошло много времени, появиличь ли прецеденты регистрации программ на Qt в росреестре?
Приходилось регистрировать программный комплекс (на Qt) в 2011 г. Не уверен сейчас, что именно в росреестре, но вот выходные данные: Свидетельство о государственной регистрации программы для ЭВМ № 2011617907 "Proximity Effect" / М.В. Авдеев, Ю.Н. Прошин, С.Л. Царевский // Федеральная служба по интеллектуальной собственности, патентам и товарным знакам, заявка № 2011612453, дата поступления 8.04.2011, зарегистрировано 10.10.2011. Всю бюрократическую сторону процедуры регистрации в то время брал на себя университет.
|
|
|
|
|