Невозможно прочитать правильный тип адреса от клиента

Я пытаюсь создать прокси-сервер Socks5, но у меня проблема с чтением действительного типа адреса. Я настроил прокси-сервер Socks5 в Firefox для тестирования. Я также пробовал с отключенным брандмауэром. Независимо от того, ввожу ли я имя домена, адрес ipv4 или ipv6, всегда будет адрес_типа 0. Я также пробовал использовать read_some или читать с помощью client_socket, но результат был тот же.

      #include <boost/asio.hpp>
#include <iostream>

const int BUFFER_SIZE = 4096;
const int SOCKS_VERSION = 5;
const int PORT = 1080;

class server {
public:
  server(boost::asio::io_context& io_context)
  : acceptor_(io_context, boost::asio::ip::tcp::endpoint(
                              boost::asio::ip::tcp::v4(), PORT)) {
start_accept();
}

private:
class session : public std::enable_shared_from_this<session> {
public:
explicit session(boost::asio::ip::tcp::socket socket)
    : client_socket_(std::move(socket)),
      server_socket_(client_socket_.get_executor()) {
  memset(client_data_, 0, BUFFER_SIZE);
}

void start() { read_socks_request(); }

private:
void read_socks_request() {
  std::cout << "Reading SOCKS request from client..." << std::endl;
  client_socket_.async_read_some(
      boost::asio::buffer(client_data_, BUFFER_SIZE),
      [self = shared_from_this()](boost::system::error_code error,
                                  std::size_t bytes_transferred) {
        self->handle_socks_request(error, bytes_transferred);
      });

  int version = static_cast<unsigned char>(client_data_[0]);
  std::cout << "SENT SOCKS version: " << version << std::endl;
  int address_type = static_cast<unsigned char>(client_data_[3]);
  std::cout << "sent SOCKS address type: " << address_type << std::endl;
  std::endl(std::cout);
}

void handle_socks_request(const boost::system::error_code& error,
                          std::size_t bytes_transferred) {
  if (!error) {
    int version = static_cast<unsigned char>(client_data_[0]);
    int command = static_cast<unsigned char>(client_data_[1]);
    int reserved = static_cast<unsigned char>(client_data_[2]);
    int address_type = static_cast<unsigned char>(client_data_[3]);

    std::cout << "Received SOCKS version: " << version << std::endl;
    std::cout << "Received SOCKS command: " << command << std::endl;
    std::cout << "Received SOCKS reserved: " << reserved << std::endl;
    std::cout << "Received SOCKS address type: " << address_type
              << std::endl;

    if (version == SOCKS_VERSION) {
      if (address_type == 1) {
        std::cout << "Ipv4 address" << std::endl;
      } else if (address_type == 3) {
        std::cout << "Domain name" << std::endl;
      } else if (address_type == 4) {
        std::cout << "IPv6 address" << std::endl;
      } else {
        std::cerr << "Invalid SOCKS address type " << std::endl;
      }
    } else {
      std::cerr << "Invalid SOCKS version" << std::endl;
    }
  } else {
    std::cerr << "Error in handle_socks_request: " << error.message()
              << std::endl;
  }
}
boost::asio::ip::tcp::socket client_socket_;
boost::asio::ip::tcp::socket server_socket_;

char client_data_[BUFFER_SIZE];
char server_data_[BUFFER_SIZE];
};

void start_accept() {
auto socket = std::make_shared<boost::asio::ip::tcp::socket>(
    acceptor_.get_executor());

acceptor_.async_accept(
    *socket, [this, socket](const boost::system::error_code& error) {
      if (!error) {
        std::make_shared<session>(std::move(*socket))->start();
      }
      start_accept();
    });
}

boost::asio::ip::tcp::acceptor acceptor_;
};

int main() {
try {
boost::asio::io_context io_context;
server server(io_context);
std::cout << "Proxy server started." << std::endl;

io_context.run();
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << "\n";
}

return 0;
}

Мой результат

      Proxy server started.
Reading SOCKS request from client...
SENT SOCKS version: 5
sent SOCKS address type: 0

Received SOCKS version: 5
Received SOCKS command: 1
Received SOCKS reserved: 0
Received SOCKS address type: 0
Invalid SOCKS address type

0 ответов

Другие вопросы по тегам