菜单

ShadowsocksController

相关源文件

ShadowsocksController 是 Shadowsocks Windows 客户端的中央编排组件。它协调所有主要子系统,管理配置,处理代理设置,并维护事件驱动通信基础设施,使客户端能够正常运行。有关整体架构信息,请参阅 架构

核心职责

ShadowsocksController 类作为 Shadowsocks Windows 客户端的骨干,承担以下关键职责:

  • 应用程序配置管理
  • 代理服务协调(TCP/UDP 转发、PAC、Privoxy)
  • 系统代理设置控制
  • 服务器管理和选择策略
  • 插件系统协调
  • 流量统计数据收集和报告
  • 与 UI 和其他组件的基于事件的通信

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs21-90

类结构和关系

组件架构

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs21-90 shadowsocks-csharp/View/MenuViewController.cs21-80

事件系统

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs69-89 shadowsocks-csharp/View/MenuViewController.cs83-94

生命周期和操作

初始化与启动

ShadowsocksController 初始化过程如下:

  1. 构造函数加载配置
  2. 初始化策略管理器和插件字典
  3. 启动流量统计追踪
  4. 设置程序更新的事件处理程序

Start() 方法

  1. 检查是否为新版本首次运行
  2. 执行版本特定的更新(如果需要)
  3. 调用 Reload() 初始化组件
  4. 注册热键(如果不是系统唤醒)

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs92-110 shadowsocks-csharp/Controller/ShadowsocksController.cs114-142

组件重载过程

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs167-255

关机流程

Stop() 方法

  1. 检查是否已停止,如果是则返回
  2. 设置 stopped 标志
  3. 如果监听器存在,则停止监听器
  4. 停止所有插件
  5. 如果 Privoxy 运行器存在,则停止它
  6. 如果启用,则更新系统代理设置
  7. 关闭加密 RNG

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs143-165

配置管理

ShadowsocksController 管理应用程序配置(_config),其中包含:

  • 服务器配置
  • 代理设置
  • 系统集成设置
  • UI 偏好设置
  • 更新和日志设置

关键配置相关方法

  • SaveConfig(Configuration):保存配置并重新加载组件
  • GetCurrentServer():返回当前选定的服务器
  • GetCurrentConfiguration():返回当前配置对象
  • SaveServers(List<Server>, int, bool):保存服务器列表、本地端口和便携模式设置

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs257-263 shadowsocks-csharp/Model/Configuration.cs11-162

代理控制系统

ShadowsocksController 提供了控制代理行为的方法

  • ToggleEnable(bool):启用或禁用代理系统
  • ToggleGlobal(bool):在全局和 PAC 模式之间切换
  • SaveProxy(ForwardProxyConfig):保存前向代理配置
  • UpdateSystemProxy():更新 Windows 系统代理设置

当用户与系统托盘菜单交互时,这些方法由 MenuViewController 调用。

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs312-340 shadowsocks-csharp/View/MenuViewController.cs600-647

代理流程图

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs312-340 shadowsocks-csharp/View/MenuViewController.cs589-647

PAC 系统集成

ShadowsocksController 管理 PAC(Proxy Auto-Configuration)系统,该系统决定哪些流量应被代理,哪些应直接访问。

  • 初始化并管理 PACDaemonPACServer
  • 提供编辑和更新 PAC 文件的功能
  • 处理用户规则文件以进行自定义 PAC 规则
  • 控制在线/本地 PAC 切换

关键 PAC 相关方法

  • SavePACUrl(string):保存自定义 PAC URL
  • UseOnlinePAC(bool):在本地 PAC 和在线 PAC 之间切换
  • TouchPACFile():打开 PAC 文件进行编辑
  • TouchUserRuleFile():打开用户规则文件进行编辑

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs343-417 shadowsocks-csharp/View/MenuViewController.cs808-921

PAC 更新过程

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs343-417 shadowsocks-csharp/View/MenuViewController.cs808-921

服务器管理

ShadowsocksController 提供了管理服务器配置的方法

  • GetCurrentServer():获取当前选定的服务器
  • GetAServer():使用当前策略获取服务器
  • SaveServers():保存服务器配置
  • SelectServerIndex():通过索引选择服务器
  • SelectStrategy():选择服务器选择策略
  • AddServerBySSURL():从 SS URL 添加服务器

来源:shadowsocks-csharp/Controller/ShadowsocksController.cs269-286 shadowsocks-csharp/Controller/ShadowsocksController.cs287-300 shadowsocks-csharp/Controller/ShadowsocksController.cs419-472

SIP002/SIP008 服务器配置支持

该控制器支持 SIP002(单个服务器 SS URL 格式)和 SIP008(在线服务器订阅)规范。

  • AddServerBySSURL():解析并从 SS URL 添加服务器
  • GetServerURLForCurrentServer():为当前服务器生成 SS URL
  • UpdateOnlineConfig():从在线配置源更新服务器
  • UpdateAllOnlineConfig():更新所有订阅的在线配置
  • SaveOnlineConfigSource():保存在线配置源列表
  • RemoveOnlineConfig():移除特定的在线配置源

来源: shadowsocks-csharp/Controller/ShadowsocksController.cs419-472 shadowsocks-csharp/Controller/ShadowsocksController.cs664-731

策略系统

ShadowsocksController 包含一个用于服务器选择的策略系统

  • SelectStrategy(string):通过 ID 选择策略
  • GetStrategies():获取可用策略列表
  • GetCurrentStrategy():获取当前选定的策略
  • UpdateInboundCounter()UpdateOutboundCounter():更新策略的流量计数器

策略系统支持负载均衡和高可用性等高级服务器选择机制。

来源: shadowsocks-csharp/Controller/ShadowsocksController.cs525-562

插件系统(SIP003)

ShadowsocksController 管理 SIP003 插件系统

  • StartPlugin():为当前服务器启动插件
  • StopPlugins():停止所有运行的插件
  • GetPluginLocalEndPointIfConfigured():获取服务器的插件端点
  • ToggleShowPluginOutput():切换插件输出显示

SIP003 为 Shadowsocks 添加传输插件提供了一种可扩展的方式。

来源: shadowsocks-csharp/Controller/ShadowsocksController.cs565-618

插件管理流程

来源: shadowsocks-csharp/Controller/ShadowsocksController.cs565-618

流量统计系统

ShadowsocksController 包含一个用于跟踪和报告网络流量的系统

  • StartTrafficStatistics():初始化流量跟踪
  • TrafficStatistics():用于计算每秒流量的后台线程
  • TrafficChanged 事件:通知 UI 流量变化
  • InboundCounterOutboundCounter 属性:跟踪入站和出站字节数

该系统使 UI 能够显示实时流量信息并更新系统托盘图标。

来源: shadowsocks-csharp/Controller/ShadowsocksController.cs620-660 shadowsocks-csharp/View/MenuViewController.cs313-337

流量统计流程

来源: shadowsocks-csharp/Controller/ShadowsocksController.cs620-660 shadowsocks-csharp/View/MenuViewController.cs313-337

与用户界面的集成

虽然 ShadowsocksController 不直接管理 UI 元素,但它提供了 UI 组件用来与核心功能交互的事件系统和方法

  1. MenuViewController 订阅了来自控制器(controller)的事件
  2. 当用户通过 UI 执行操作时,MenuViewController 会调用控制器上的方法
  3. 控制器处理这些请求并触发事件
  4. MenuViewController 根据这些事件更新 UI 元素

这种关注点分离使得核心功能可以独立于 UI 运行。

来源: shadowsocks-csharp/View/MenuViewController.cs77-109 shadowsocks-csharp/Controller/ShadowsocksController.cs69-89

错误处理与日志记录

ShadowsocksController 实现了错误处理和日志记录机制

  • 使用 NLog 进行不同级别的日志记录
  • ReportError() 方法通过 Errored 事件将错误传播到 UI
  • 使用 logger.LogUsefulException() 进行详细的异常日志记录
  • 用于调试的详细日志记录开关

来源: shadowsocks-csharp/Controller/ShadowsocksController.cs264-268 shadowsocks-csharp/Controller/ShadowsocksController.cs475-483

总结

ShadowsocksController 是 Shadowsocks Windows 客户端中的中央协调点。它负责管理配置、控制代理服务、处理系统集成、响应用户操作,并提供一个用于与 UI 通信的事件系统。理解该组件对于了解 Shadowsocks 客户端如何运行以及其各个子系统如何交互至关重要。