v2rayN-HY2 能正常使用

总功能列表在这篇分析里.

我们现在实现第 7 项 能正常使用

首先要在 v2rayN.exe 同目录下放一个支持 hy2 的 v2ray 内核. 写本文时, 最新版本 v5.21.0 

下面, 开始处理代码.
打开主窗口 .cs 文件的设计器
右键MainForm.cs打开主窗口设计器

找到菜单项, 双击, 
打开菜单项 "设定为活动服务器" 的响应函数
双击设定为活动服务器菜单项打开响应函数

一路走读代码, 遇到函数就 F12 跳进去. 
最终看到 V2rayConfigHandler 模块的 GenerateClientConfig 函数.
然后我们需要在 outbound 函数里面 添加 生成 hy2 内容的逻辑.
在outbound函数里加生成Hy2配置的逻辑

抄一下原来的 Trojan 的流程框架, 把 hy2 相关的数据处理一下.
照Trojan的流程框架改出hysteria2分支

从配置文件上看, hy2 的参数, 要写在 streamSettings 里面. 所以我们还要继续修改 boundStreamSettings 函数.
跳进去一看, 对不同的 network, 相应地生成不同的 streamSettings.
也是照着其它的逻辑框架, 实现 hy2 的处理.
boundStreamSettings里加hysteria2的处理

为了照样子抄呢, 还要新增一个结构 Hy2Settings
看一下其它的 Settings 定义在哪里, 鼠标点在 QuicSettings 上, F12 跳转到定义.
动图演示:在QuicSettings上按F12跳转到结构定义
原来在 V2rayClientConfig 模块里.

我们也照样子抄一个结构.
照样子新增Hy2Settings结构类

这个结构是和配置文件的json结构相对应的. 对比观察一下.
C#结构字段与json键名要一一对应

进一步的, 在配置文件的json结构中, hy2Settings 是 streamSettings 的子元素.
那么在 C# 的数据结构定义中, 也要给 StreamSettings 类(结构) 添加一个 Hy2Settings 数据成员(子元素).
StreamSettings类里加hy2Settings子成员

进一步的, 请你注意到, C# 中数据成员的命名, 要和 json 结构中的 key 名称完全一致.
这是和 C# 中将 数据结构 序列化为 Json 结构的规则有关.

跑起来看看.
报了一堆错.
编译运行后报错,回启动流程排查

似乎是启动命令有问题.

继续走读代码, 找到了 V2rayHandler 模块的 V2rayStart 函数.
可以看到 p.Start(); 就是启动 v2ray.exe 程序的地方. 我们在这里打个断点. 快捷键 F9
在p.Start处按F9下断点

程序跑起来, 会暂停在断点这里, 并且不会执行断点这一句.
我们查看一下内存, 即将执行的命令到底是什么.
鼠标点在 p 变量上, Shift + F9 查看内存.

从代码上看, 前面一段, 对 StartInfo 结构的填充, 就是在设置运行的参数. 
对应着内存数据一起分析, 
快速监视看到Arguments是空的
相当于只执行了v2ray.exe,没带参数
结果就是, 相当于在命令行执行
D:\_work\v2rayN-3.29-VLESS\v2rayN\bin\Debug\v2ray.exe
按 v2ray v5.21.0 的启动语法来说, 这是有问题的. 
官方文档说明启动要v2ray.exe run -c config.json

我们去命令行实际操作一下就知道了.
在命令行中, 应该使用 
v2ray.exe run -c config.json
的形式.
命令行验证v2ray.exe run -c config.json可用

落实在代码上, 把参数设置进去.
代码里补上Arguments参数再测试

再跑起来. 测试一下. 能用了.
测试通过:curl经10808代理返回301

========
开了一个分支, 本文的修改内容已提交.
如果你有兴趣, 可以看到整个的开发过程.

本次修改记录
评论