# socks_server
**Repository Path**: actcms/socks_server
## Basic Information
- **Project Name**: socks_server
- **Description**: 一个socks4/5的代理服务器实现。
- **Primary Language**: Unknown
- **License**: BSL-1.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 49
- **Created**: 2014-06-19
- **Last Updated**: 2022-08-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
一个使用现代c++实现的socks4/5协议的实现
=======================================
使用c++20协程,支持socks4/socks4a/socks5的server/client实现.
### 使用示例程序:
```
#include "socks/logging.hpp"
#include "socks/socks_server.hpp"
#include "socks/socks_client.hpp"
#include "socks/use_awaitable.hpp"
#include
#include
#include
#include
namespace net = boost::asio;
using net::ip::tcp;
using namespace socks;
using server_ptr = std::shared_ptr;
net::awaitable start_socks_server(server_ptr& server)
{
tcp::endpoint socks_listen(
net::ip::address::from_string("0.0.0.0"),
1080);
socks_server_option opt;
opt.usrdid_ = "jack";
opt.passwd_ = "1111";
auto executor = co_await net::this_coro::executor;
server =
std::make_shared(
executor, socks_listen, opt);
server->open();
co_return;
}
net::awaitable start_socks_client()
{
auto executor = co_await net::this_coro::executor;
tcp::socket s(executor);
tcp::endpoint server_addr(
net::ip::address::from_string("127.0.0.1"),
1080);
// tcp socket connect to socks server.
boost::system::error_code ec;
co_await s.async_connect(server_addr, asio_util::use_awaitable[ec]);
if (ec)
{
LOG_WARN << "client connect to server: " << ec.message();
co_return;
}
// handshake and tell to socks server target.
socks::socks_client_option opt;
opt.target_host = "www.baidu.com";
opt.target_port = 80;
opt.proxy_hostname = true;
opt.username = "jack";
opt.password = "1111";
co_await socks::async_socks_handshake(s, opt, asio_util::use_awaitable[ec]);
if (ec)
{
LOG_WARN << "client handshake to server: " << ec.message();
co_return;
}
LOG_DBG << "completed socks handshake.";
// Next, do some http stuff with socket...
co_return;
}
int main()
{
net::io_context ioc(1);
server_ptr server;
co_spawn(ioc, start_socks_server(server), net::detached);
co_spawn(ioc, start_socks_client(), net::detached);
ioc.run();
return 0;
}
```
very easy to use!!!