源码已经发布在 Github: https://github.com/cnbatch/cpp20-socks5demo
RFC 1928 要求的功能几乎都实现了。
Connect
BIND
Associate
Socks5 标准 (RFC 1928) 写着必须实现这个功能,然而我做的只是个 Demo 程序,平时也用不到 GSSAPI ,为了简单起见就不实现了。
用了协程之后,思路清晰多了,不像 callback 时那么头大,相对而言轻松多了。
两大原因:
我自己是 Windows + FreeBSD 用户,正好需要这样的 socks5 server 程序——可以同时在 Windows 与 FreeBSD 运行,能够支持 TCP + UDP, IPv4 + IPv6 ,使用相同的运行配置方式。
虽然平时 socks5 server 主要在 FreeBSD 当中运行,但稳妥起见也要在 Windows 台式机运行同样的程序,用作 backup 方案。
最重要的一点,两个平台都要采用 Native 编译方式,而不是单纯的“妥协”编译方式。直白点说就是:
一直想试试 ASIO 库的协程模式,毕竟写起来流畅多了。我个人记忆力不太好,callback 数量一多就头大,实在记不过来。趁着有需求,正好拿来试一试。
由于这个程序只是个 Demo ,用是能用。只不过暂时不支持侦听到具体的地址,不提供日志记录,连接超时的时间判断是硬编码的。如果要其他额外功能都实现的话,就不能单靠一个源文件了,只能另开新 repo 把各部份拆开来重新梳理一遍。以后再在新 repo 内慢慢拆、慢慢补。
1
mayli 33 天前
的确,socks5 算是最简单实用的 tcp 编程了,要是去掉 ipv6, bind, udp, 还可以更简单。
|
![]() |
2
aqtata 32 天前
Tab 缩进难受
|
![]() |
3
nmap 32 天前
asio 已经支持协程了吗
|
4
slideclick 32 天前
膜拜
|
5
cnbatch OP @nmap 我记得 2022 年,ASIO 开始支持协程。刚看了下 Github 和作者自己写的 Examples ,应该是在 2021 年 12 月的 1.22.0 开始支持的:
https://think-async.com/Asio/asio-1.22.0/doc/asio/examples.html https://github.com/chriskohlhoff/asio/tree/asio-1-22-0 我现在才开始用算是有点晚,当然这也是为了等待编译器更新以及作者修 bug ASIO 最新版(目前是 1.30.2 )用起来还算顺畅 |
6
cnbatch OP @aqtata 哈哈哈,这是 Eric Allman 风格,原版的 Allman Style 缩进就是 Tab
我长期用 C# ,习惯了 Allman 缩进方式 https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions#style-guidelines C# 用空格缩进,到了 C++我就索性使用原版 Allman 缩进风格 |
7
WorseIsBetter 32 天前
毕业后就没怎么写过 C++ 了,几年没关注,现在都已经有原生协程了,有点感慨
当然以前也可以用 boost.context 之类的实现,只不过语法看上去并不优雅便是了 --- 题外话,记得上学那会儿为了练手,搞了个 boost.asio 的 PHP binding ,用 PHP 的 generator 实现的协程: https://web.archive.org/web/20201102142032/https://github.com/CismonX/php-asio/wiki/Basic-concepts-of-php-asio#231-generator (不过由于水平太菜,做出来的东西性能还不如 AMPHP 之类的纯 PHP 实现,还有内存泄漏的问题不知道该怎么解决,早已删库跑路,哈哈) |