Russian Qt Forum
Ноябрь 24, 2024, 16:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: tcp proxy server. Только на berkley sockets (select/poll/epoll)  (Прочитано 11929 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #15 : Январь 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);
 
Как мне узнать, что ответ получен не полностью и ожидается продолжение?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #16 : Январь 31, 2024, 10:49 »

Прочитал очередную порцию данный (chunk) добавил к общему буферу.
А дальше уже смотришь, если в общем буфере получена команда полностью (от SELECT и до ';'),  то выкусываем ее из буфера и обрабатываем, иначе ждем оочередной чанк.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #17 : Январь 31, 2024, 10:50 »

Как мне узнать, что ответ получен не полностью и ожидается продолжение?

никак - tcp потоковый протокол
для этих целей делают логический пакет "[размер][данные]"

Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #18 : Январь 31, 2024, 10:55 »

Прочитал очередную порцию данный (chunk) добавил к общему буферу.
А дальше уже смотришь, если в общем буфере получена команда полностью (от SELECT и до ';'),  то выкусываем ее из буфера и обрабатываем, иначе ждем оочередной чанк.


никак - tcp потоковый протокол
для этих целей делают логический пакет "[размер][данные]"

Понятно) Спасибо) сегодня будет чем заняться)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #19 : Январь 31, 2024, 10:58 »

При подключении нового клиента, выполняем подключение к серверу и после этого имеем пару сокетов client-proxy и proxy-server, вот все что приходит по первому сокету, нужно отправить во второй и наоборот. Если один из сокетов закрывается, то нужно закрыть и второй.
Как правило эти два сокета хранятся в объектах, которые называют session. Улыбающийся

Я тоже к такой схеме пришёл). Назвал объект только proxy_client.

Цитировать
Как мне узнать, что ответ получен не полностью и ожидается продолжение?

Нужно реальный трафик смотреть. В общем случае никак. Если в сети текст, то надеяться, что есть разделитель ";", либо по слову "SELECT" или другим косвенным признакам.
Если бинарный протокол, то его нужно знать, скорее всего, где-то длина пакета должна быть.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #20 : Январь 31, 2024, 11:00 »

И еще момент, лучше разделять запросы по ';' не смотря на 'SELECT'.
В SQL есть и другие команды, кроме выборки данных (SELECT). Улыбающийся
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #21 : Январь 31, 2024, 11:10 »

И еще момент, лучше разделять запросы по ';' не смотря на 'SELECT'.
В SQL есть и другие команды, кроме выборки данных (SELECT). Улыбающийся

По хорошему да.., но ';' не обязателен в конце запроса. Поэтому про пример трафика и пишу.
Если явных признаков начала и конца нет, то парсер придется писать)).
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #22 : Январь 31, 2024, 11:22 »

Посмотрел трафик postgresql, там бинарный формат, но очень простой.
Код
C++ (Qt)
uint8_t type;
uint32_t length;
uint8 payload[ length - sizeof( length ) ];
 

type = 0x51 - Simple query
length содержит длину тела, включая само поле length
payload содержит строку запроса 'select * from tab;'

type = 0x54 - Row description
Это ответ на запрос, row идут последовательно один за другим
« Последнее редактирование: Январь 31, 2024, 11:24 от Old » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #23 : Январь 31, 2024, 11:27 »

Посмотрел трафик postgresql, там бинарный формат, но очень простой.

еще в помощь https://dev.to/yugabyte/how-to-sniff-postgresql-traffic-3idm

и все это надо сделать как тестовое задание ? )
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #24 : Январь 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 под любой лицензией во избежание использования Вашего кода.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #25 : Январь 31, 2024, 16:18 »

А если запрос получен не полностью?
Например, получили только
"SELECT * FRO"
а остаток прилетит позже?
А в конце - точка с запятой
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #26 : Февраль 03, 2024, 16:42 »

Всем спасибо за консультацию и советы)
Всё вроде более-менее поправил.
Отправил им на рассмотрение  Улыбающийся 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #27 : Февраль 04, 2024, 20:31 »

Результатов пока нет?  Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #28 : Февраль 04, 2024, 20:49 »

Результатов пока нет?  Улыбающийся
Пока нет) Завтра, наверное, озвучат)  
Но, пожалуй, я в любом случае откажусь, поскольку пока это тестовое задание писал, прошёл другое собеседование.
Показал им свои проекты, там сразу взяли)  
Завтра пойду оформляться  Улыбающийся
« Последнее редактирование: Февраль 04, 2024, 20:54 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #29 : Февраль 06, 2024, 16:24 »

Результатов пока нет?  Улыбающийся

Ваше тестовое задание просмотрели, оценили как очень хороший результат.
Как следствие, хотели бы пригласить вас на собеседование.
 Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.254 секунд. Запросов: 23.