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

Войти
 
   Начало   Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
Страниц: 1 ... 8 9 [10]
 91 
 : Январь 31, 2024, 11:22 
Автор m_ax - Последний ответ от Old
Посмотрел трафик 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 идут последовательно один за другим

 92 
 : Январь 31, 2024, 11:10 
Автор m_ax - Последний ответ от ssoft
И еще момент, лучше разделять запросы по ';' не смотря на 'SELECT'.
В SQL есть и другие команды, кроме выборки данных (SELECT). Улыбающийся

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

 93 
 : Январь 31, 2024, 11:00 
Автор m_ax - Последний ответ от Old
И еще момент, лучше разделять запросы по ';' не смотря на 'SELECT'.
В SQL есть и другие команды, кроме выборки данных (SELECT). Улыбающийся

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

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

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

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

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


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

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

 96 
 : Январь 31, 2024, 10:50 
Автор m_ax - Последний ответ от qate
Как мне узнать, что ответ получен не полностью и ожидается продолжение?

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


 97 
 : Январь 31, 2024, 10:49 
Автор m_ax - Последний ответ от Old
Прочитал очередную порцию данный (chunk) добавил к общему буферу.
А дальше уже смотришь, если в общем буфере получена команда полностью (от SELECT и до ';'),  то выкусываем ее из буфера и обрабатываем, иначе ждем оочередной чанк.

 98 
 : Январь 31, 2024, 10:41 
Автор m_ax - Последний ответ от m_ax
А если запрос получен не полностью?
Например, получили только
"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);
 
Как мне узнать, что ответ получен не полностью и ожидается продолжение?

 99 
 : Январь 31, 2024, 10:30 
Автор m_ax - Последний ответ от qate
Я пока предполагаю, что это просто plain text в котором могут быть sql запросы.

не похоже https://www.manniwood.com/2016_12_29/tcpdump_pg.html

 100 
 : Январь 31, 2024, 10:26 
Автор m_ax - Последний ответ от Old
А если запрос получен не полностью?
Например, получили только
"SELECT * FRO"
а остаток прилетит позже?

Страниц: 1 ... 8 9 [10]

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