go-shadowsocks2 源码简析

Reading Time: 4 minutes 我们现在来简单分析一下 go-shadowsocks2 这个项目. 第一篇就简单分析一下这个项目大体的处理流程. go 语言的项目找入口就相当好找了. 一眼就可以看到 main 函数在哪了. 来看看吧. 照例, 先看 client 在 main 函数中可以看到: //… func main() { //… flag.StringVar(&flags.Client, “c”, “”, “client connect address or url”) flag.StringVar(&flags.Socks, “socks”, “”, “(client-only) SOCKS…

Shadowsocks (二) TCPRelayHandler

Reading Time: 3 minutes 这一次我们主要分析一下 TCPRelayHandler 这个类, 这个类如前文所述, 是 TCPRelay 创建出来, 处理单个 TCP 连接的一个类. 其主要通过 handle_event 函数来处理 IO 事件. 遗留问题 回顾一下我们之前的遗留问题: daemon 进程是怎么启动的呢? 为什么要等最后 loop.run() 之前再 set_uesr 呢? loop 是怎么工作的? 为什么还需要判断 handler 不为空, 什么情况下它会是空呢? 最后看起来是在判断超时的几行代码的意义是什么呢? 三个 server 分别是怎么工作的呢? 为什么 TCPRelay 生成完新 handler…

Shadowsocks (一) 主循环

Reading Time: 5 minutes 这里简单分析一下 Shadowsocks 这个软件的源码. 因为网上一直有声音认为其源码质量不错. 刚好最近在学一些服务器编程相关的知识, 所以就来简单分析一下它. 同时由于希望能获得一些阅读源码的经验. 这里会简单记录我读源码的心路历程. 目录结构 首先我们来 tree 一下, 惯例, 测试相关的文件就省略了 ❯ tree . ├── CHANGES ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── MANIFEST.in ├── README.md ├── README.rst ├── config.json.example ├── de…