跳到主要内容

Inside

rabbit-digger 内部的秘密 🐰...

Net

Netrabbit-digger 的核心概念. 每个代理协议都是根据一个配置(如代理服务器地址, 认证方式, 基于的 Net) 构造一个新的 Net. 这个 Net 提供了 tcp_connectudp_bind, 对使用者隐藏了服务器的连接细节, 能够让使用者直接调用 tcp_connectudp_bind.

Net 的实现者不应该使用异步运行时提供的 TcpStreamUdpSocket 来连接代理服务器. 而是应该在 Config 中声明 NetRef, 然后使用这个 Net 来连接代理服务器.

因此, 每个代理协议都能够互相嵌套, 自然的实现了代理链.

NetRef

NetRef 是一个 enum, 有 StringNet 两种状态. 当 Config 从文件读入时, NetRef 是一个未解析的字符串. 而 rabbit-digger 会根据引用关系一次将 NetRef 解析成 Net 实例, 然后传给 NetFactory::new.

ExternalFile

ExternalFile 可用在 Config 中. 代表着这个字段是一个外部的文件. ExternalFile 可以是文件, 也可以是 Url. 当 ExternalFile 是文件且 watchtrue 时, Net 会在文件变更时被重建. 当 Urlinterval 被设置时, 文件会被轮询, 并且在改变时重建 Net.

Config 处理流

所有 Config 类型都实现了 Config trait, rabbit-digger 会在加载 Net 时调用 Config::visit 来访问内部的字段, 并填入所有的 NetRef, ExternalFile. 在填入 ExternalFile 的时候会记录所有使用到的文件, 并在文件变动的时候重新构建 Net.