通过WebSocket隧道,尝试将ASP.NET网站空间当作VPS来使用

作者:V君 发布于:2021-1-17 11:50 Sunday 分类:折腾手记

先上 PoC源代码 再开始扯,这次不是着重解决某个问题,而是尝试确定某种可能性。

以前使用过 C9.io 提供的免费在线开发环境来搞各种事情,包括正常上网,无非是利用 Web Sockets 建立隧道,然后配合客户端连接到在上面运行各种应用程序。
现在C9已经被收购且停止免费了,那就公开来说吧w

这次也不例外,只不过花了点钱搞了个支持 ASP.NET 4.5+ 的网站空间,然后在上面搞类似的事情。

基础设施 -- WebSocket 转 TCP 模块

首先要使用 WebSocket 来建立一条隧道,要求网站空间支持且启用 WebSocket,不然没法整。这里有个未经优化,但还能凑合着用的例子,只要挂在 HttpModule 中 HttpApplication 的 PostMapRequestHandler 事件,填好参数就能吃。

折腾1 -- SSH 终端

略去寻找绿色 SSH 服务端的辛酸过程,时间直接转到发现 FxSsh 这个纯托管实现的服务端。这里要分成两个部分来扯,分别是使用基于 ConPTY 的 MiniTerm 和兼容低版本 Windows 的简单兼容实现。由于 FxSsh 主要实现的是 SSH 协议通道,服务端的终端并没有适配,尽管源代码中带了个名为 MiniTerm 的 DEMO 来适配到较新系统的 ConPTY。

第一部分:基于 MiniTerm 的实现。原版的 MiniTerm 虽然导入了 ResizePseudoConsole 这个 API 但并没有使用。而且由于 NuGet 上的 FxSsh 不是最新版,没有窗口大小变更事件的支持。 因此我把他们全都拷贝到自己的项目中并注明来源了。在此之上再加以修改 MiniTerm 使窗口大小变更事件适配到 MiniTerm 的实现。目前并没有发现太多问题。有点小遗憾的是 MiniTerm 使用的 ConPTY 功能是 Windows 10 近些年的更新才引入的,因此许多网站空间的系统都不支持,会报「在 kernel32 中找不到 CreatePseudoConsole 入口」的错误,因此我准备了另一个方案,见接下来的第二部分。

第二部分:另行实现一个兼容低版本 Windows 的控制台进程适配。在项目中起名为 EasyTerminal。起初简单将控制台进程的标准输入输出还有错误输出重定向到 SSH 通道,然鹅,回车键不起作用,而且不回显。将回车键拦截下来,改成 StandardInput.WriteLine 调用,总算是能满足最基本的需求。尽管还是没有实时回显,得按下回车键之后才显示出来,功能按键和窗口大小什么的更无从说起。目前仍在使用零碎的时间持续摸索(咕XD)…

折腾2 -- 正常上网 将网站空间当作 V2 服务端使用

编译部署这个项目,然后将 V2 的两个 exe 和配置文件丢进 App_Data 目录,然后使用 WS 隧道连接到监听的 URL,最后在 V2 客户端指向 WS 隧道客户端,这时候就能吃了。分配了较大的缓冲区大小,这应该能有效减少损耗,如果网速慢,你需要测一下空间到你的网速。

不水。

标签: 软件开发 个人服务器 C# HTTP Web技术 传输协议 Windows .NET IIS WebSocket

评论(0) 引用(0) 浏览(8)

做了个节奏光剑实时状态挂件

作者:V君 发布于:2020-10-28 22:38 Wednesday 分类:折腾手记

点击查看原图

TL;DR [ 源代码 ] [ 本体 ]


效果:在游戏画面前叠加一层,用于显示分数、歌曲、性能信息和图表
安装:使用 ModAssistant 安装 HTTPStatus 和 YUR 后将 dll 丢进 Plugins 目录然后运行exe
  若找插件管理器找不到 YUR,去官方 discord 找
  HTTPStatus 插件可以去 GitHub 找 release 若是没有 release 就自己编译吧!
配置:无需任何配置
扯扯:

看到一些视频有些叠加在前面的挂件,后来了解到原来是通过HTTP方式向外部提供来实现的。现有的实现大部分都是基于网页,然后用OBS之类的录屏软件做叠加处理。

我一直用 GeFore Experience 来录屏,懒得改用 OBS。那就自己撸一个吧,反正半透明的窗体也不难搞,于是这玩意儿就出来了。早期只有 HTTPStatus 的数据,后来想到可以把 YUR 的心率和燃烧率整合进来,又做了个插件去读YUR的数据(插件的插件……)。再后来,想知道为啥帧数很低,就把 OpenHardwareMonitor 集成进来读取 CPU 和 GPU 负载了(发现是 CPU 拖了后腿…),它自带有 sys 文件会释放到 exe 旁边,如果杀毒软件拦截,你就要做出选择是相信 OpenHardwareMonitor 还是相信你的杀毒软件了,我不背锅。

最后就是解释为啥这么迟才发表文章了。还不是因为游戏更新,而且YUR插件也没出来,就一直拖着一直到昨天去 YUR 的 discord 问了才知道,原来插件已经出来,但是还没有通过 BeatMods 的审核…(我想说我做的音量插件也一直处于 Pending 状态,别人家晚来的插件都通过了。。

标签: 软件开发 插件 C# Winform Unity VR游戏

评论(0) 引用(0) 浏览(102)

做了个节奏光剑SFX音量调整插件

作者:V君 发布于:2020-10-23 13:21 Friday 分类:折腾手记

TL;DR [ 源代码 ]


效果:将击中方块和 Miss 的效果音调整至最大
安装:将 dll 丢进 Plugins 目录
配置:无需任何配置
扯扯:

原味的游戏效果音太小了,打起来没感觉,尽管 Auros 桑的 Enhancements 插件有调整各种音量的功能,但好像又还没为游戏更新做好准备,那我就先自己撸个写死的吧。

标签: 软件开发 插件 C# VR游戏

评论(0) 引用(0) 浏览(135)

做了个节奏光剑的歌词插件

作者:V君 发布于:2020-8-2 8:56 Sunday 分类:折腾手记

TL;DR [ 下载 ][ 源代码

点击查看原图
效果:在游戏过程中同步显示带翻译、注音的歌词
安装:使用 ModAssistant 安装 IPA 和必要的库,然后将 BeatLyrics.dll 丢进 Plugins 目录
配置:一共需要设置两个环境变量,先设置环境变量再启动 Steam
  BeatSaberDir - 指向 BeatSaber 安装目录,让工具能扫描地图文件
  BeatLyricsDir - 指向歌词目录,工具将会把放歌词文件存到这里,插件将会来这里读取
使用:需要先用工具为地图添加歌词才能在游戏中显示
扯扯:

做这个玩意儿之前肯定会先看看有没有别人做好的东西,比如 BeatSinger 不过它的样式以及歌词关联方式并不符合我的习惯,于是就参照多个插件的源代码来整一个自己的版本,还搞了个管理界面来调整歌词时间轴。

标签: 软件开发 插件 C# Unity VR游戏

评论(1) 引用(0) 浏览(128)

【内存盘已可用】[稳!真香!]基于WinSpd驱动用C#实现虚拟磁盘

作者:V君 发布于:2020-6-14 11:14 Sunday 分类:折腾手记

老样子先 [ 源代码 ] and 目前实现已功能的用法 TL;DR 再展开扯扯。

在开始之前不要忘记安装 WinSpd 驱动,默认安装路径为 Program Files (x86)\WinSpd 附带有引用程序集和示例代码。安装包里面的驱动文件已经过数字签名,无需打开测试模式。

:: 创建磁盘镜像
svd create raw 50GB C:\Path\To\Your\Image.img
:: 创建虚拟磁盘并挂载镜像
svd mount image C:\Path\To\Your\Image.img
:: 创建虚拟磁盘并分配内存(内存盘)
svd mount ramdisk 10GB
:: 创建虚拟磁盘并分配内存(内存盘)建立NTFS分区并创建Temp文件夹
svd mount TempNtfsRamDisk 10GB
:: 创建虚拟磁盘并分配内存(内存盘)建立NTFS分区并创建Temp文件夹 然后分配盘符 Z:
svd mount ZTempNtfsRamDisk 10GB
:: 安装为windows服务
svd install SvdRamdisk10G mount ZTempNtfsRamDisk 10GB

别看 Main 的 Usage 写了那么多参数组合,其实目前也就实现了上面几条……

好了开扯吧! (o ‵-′)ノ”(ノ﹏<。)

两三年前我妄图免驱在 Windows 上实现 FUSE 结果被 WebDAV 坑了一把,接着又被 SMB 接口的实现劝退… 最近折腾起无盘,倒腾 iSCSI 发现这东西除了能实现无盘启动之外,并不香,性能也不高,连接到本地的 Ram Disk 也只有 200MB 每秒。

总的来说 Windows 上自带的这类功能设计的极为保守,iSCSI 和 SMB 在遇到一丁点儿差错的时候都首选了重试并等待的保守策略,造成的直观体验就是界面冻结。在 Windows 的免驱 FUSE、虚拟磁盘的尝试走到尽头。“我V君就算是饿死,从这里跳下去,也不使用三方驱动”自从看到 WinFsp 项目主页上介绍的 WinSpd 之后,“真香!

通过查看示例,发现 WinSpd 的使用方法十分简单,和 TalAloni 的 iSCSI 接口相似(其实都是在 SCSI 层转换成简单接口),还支持 TRIM(UNMAP) 指令,再稍加些外围代码把实现好的接口喂给驱动,运行起来就能听到插入U盘的提示音,然后就能在设备管理器和磁盘管理器中看到新增的虚拟盘了。

把之前做好的 RamDisk 实现移植过来之后就赶紧跑了跑性能测试看看,结果发现完爆 iSCSI 方式,速度可达 1.5GB 每秒,虽然没有 SuperSpeed RamDisk 快,但也够用了。起初认为可能是托管代码效率的影响,勉强尝试用C语言实现接口,发现性能也没差太远。那只能甩锅给内核与应用程序之间来回交互导致的性能损失了吧,印象中 SuperSpeed RamDisk 的内存占用会体现在 System 进程,那就能想象到 RamDisk 的逻辑全都在驱动中实现了。

接下来扯一下稳定性,之前我不首选使用第三方驱动来实现虚拟磁盘的原因是怕蓝屏。在保存好所有需要的东西后,开始做做死看看 WinSpd 的稳定性。尝试在实现的接口里面抛出异常、意外结束进程这些操作之后,发现稳定得一笔,一次蓝屏都没出现!接口中抛出异常给系统的反应是IO错误,进程意外结束则体现为拔掉U盘。这不就是我梦寐以求的粗暴策略吗?去你的重试等待!

最后就是「展望未来」环节了。如果把接口的实现做成 C/S 架构,就能在一定程度上把 iSCSI 代替掉了。目前我用 iSCSI 不仅用作启动,还用来跑远程存储、差分快照、RamDisk。若再加一些简单的压缩,或许还能突破 1Gbps 局域网传输速度呢,反正现在的 CPU 跑的这么快嘛!这就是自己造轮子的好处,可以随意改变姿势~

这个月的干货(?)

标签: 软件开发 C# 控制台 Windows服务

评论(0) 引用(0) 浏览(237)

Powered by emlog 去你妹的备案 sitemap