ретрансляция трафика

416
08 августа 2017, 16:25

Как произвести ретрансляцию трафика через сокеты в Boost Asio. Пытаюсь реализовать что то вроде сервера, к которому подключаются клиенты с одной стороны и подключается БД MySql с другой. При подключении клиента к серверу, сервер ретранслирует трафик к БД. И клиент работает с БД, как будто он на прямую подключен к БД.

Answer 1

Вот прокси-сервер в 50 строк кода,
объяснять как он работает я конечно же не буду.

#include <boost/asio.hpp>
#include <iostream>
boost::asio::io_service io_service;
boost::asio::ip::tcp::endpoint src_endpoint{boost::asio::ip::address_v4::loopback(), 8080};
boost::asio::ip::tcp::acceptor acceptor{io_service, src_endpoint};
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query dst_query("arrowd.name", "80");
boost::asio::ip::tcp::resolver::iterator dst_iterator = resolver.resolve(dst_query);
void proxy(std::shared_ptr<boost::asio::ip::tcp::socket> src,
           std::shared_ptr<boost::asio::ip::tcp::socket> dst,
           std::shared_ptr<std::vector<char>> buf) {
  src->async_read_some(boost::asio::buffer(*buf), [src, dst, buf](auto error, auto n) {
    std::cout << "read " << n << ' ' << error << '\n';
    if (error) { src->close(); dst->close(); return; }
    async_write(*dst, boost::asio::buffer(buf->data(), n), boost::asio::transfer_all(),
                [src, dst, buf](auto error, auto n) {
      std::cout << "write " << n << ' ' << error << '\n';
      if (error) { src->close(); dst->close(); return; }
      proxy(src, dst, buf);
    });
  });
}
void accept_one() {
  auto src = std::make_shared<boost::asio::ip::tcp::socket>(io_service);
  acceptor.async_accept(*src, [src](auto error) {
    std::cout << "accept " << error << '\n';
    if (error) return;
    auto dst = std::make_shared<boost::asio::ip::tcp::socket>(io_service);
    dst->async_connect(*dst_iterator, [src, dst](auto error) {
      std::cout << "connect " << error << '\n';
      if (error) return;
      proxy(src, dst, std::make_shared<std::vector<char>>(4096));
      proxy(dst, src, std::make_shared<std::vector<char>>(4096));
    });
    accept_one();
  });
}
int main() {
  accept_one();
  io_service.run();
}

ЗЫ: тестовый сервер был любезно предоставлен @arrowd.

READ ALSO
Нейросеть для распознавания чисел Qt C++ [требует правки]

Нейросеть для распознавания чисел Qt C++ [требует правки]

Здравствуйте! Появилась задача - сделать нейросеть, которая будет распознавать числа от 1 до 15 на С++ QtНикогда раньше не имел с этим дело

385
Анимация border

Анимация border

Здравствуйте!

245
How to display a slide counter in slideshow fotorama.io? [требует правки]

How to display a slide counter in slideshow fotorama.io? [требует правки]

Help me pleaseHow to display the count of slideshow: in the library http://fotorama

288
Непростая выборка из MySQL WordPress

Непростая выборка из MySQL WordPress

Здравствуйте! В базе есть категории wp_termsСвязи категорий(где указывается кто родитель категории находятся в таблице wp_terms_taxonomy

324