Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > SQL-Proxy


Автор: exploys 4.6.2010, 13:13
Необходимо написать что-то наподобии sql-proxy на c++. Т.е. перехватывать и изменять SQL запросы посылаемые от клиента серверу.
Т.е. клиент конектиться к моему приложению, которое изменяет запросы и посылает в СУБД. А результат выполенния запроса в неизменном виде возвращает клиенту.

Как лучше сделать и может есть какие-то простые примеры таких вот "редиректоров" любых tcip/ip пакетов?
В какую сторону копать?

Автор: SenkraD 4.6.2010, 13:32
exploys,  если клиент знает, что между ним и СУБД есть вы -
тоесть оно посылает запросы вам, то всё просто:
    - получили запрос
    - отпарсили, если нужно
    - изменили и(или) что-то добавили
    - послали запрос на СУБД
    - получили ответ от CУБД
    - отослали ответ к клиенту

Если же клиент думает, что конектится к СУБД, а тут вы, то
    - парсим пакет
    - ищем запрос
    - все пунктики с первого варианта

по поводу готовых "редиректоров", если под конкретную СУБД,
то думаю найдёте, а под все сразу вряд ли

Автор: exploys 4.6.2010, 14:58
Есть mysql-proxy, но нужно написать более универсальную.
А нету вообще просто самых простых исходников редиректоров tcp пакетов? И чтоб держало тысячи подключений.
Или книгу с примерами не посоветуете.

Добавлено через 7 минут и 5 секунд
Да кстати инетересует вариент именно клиент думает, что конектится к СУБД.
В основном интересует, как создать такой полностью прозрачный прокси. Хотябы самый простой пример.

Автор: exploys 5.6.2010, 23:26
Попробовал сделать порт маппинг через TIdMappedPortTCP.

Попробовал перенаправлять трафик из браузера на мой прокси UserGate который висит на порте:8088
На форму кинул Button1 и IdMappedPortTCP1
Обработчик кнопки
Код:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{

    IdMappedPortTCP1->DefaultPort = 8087;
    IdMappedPortTCP1->MappedHost = "127.0.0.1";
    IdMappedPortTCP1->MappedPort = 8088;
    IdMappedPortTCP1->TerminateWaitTime = 500000;
    IdMappedPortTCP1->Active = true;
}
//---------------------------------------------------------------------------

Жму кнопку, появляется открытый порт 8087. Браузер настроен на прокси на 8087.
Открываю сайты в браузере, сайты открываются, но постоянно эксепшен:


Код

---------------------------
Debugger Exception Notification
---------------------------
Project TestTCPIP.exe raised exception class EIdNotASocket with message 'Socket Error # 10038
Socket operation on non-socket.'.
---------------------------
Break   Continue   Help   
---------------------------


А если пытаюсь маппить трафик с 3307 на 3306, где у меня висит MySQL, то тупо клиент MySQL подвисает.
Может там нужны ещё какие-то компоненты?
Или кинтье какие-нить простые рабочие исходники плиз. 

Автор: exploys 8.6.2010, 22:28
Все дело было в Indy10, включая Тибуроновскую.
Все решилось переходом на Indy9.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)