有没有和我一样,用 scoop 安装 sunshine 的朋友?有的话,那你有没有遇到一个无法连 接的问题?
scoop 是我的主要包管理工具,所以我基本上安装什么软件,都会去 scoop 上先找一下 有没有。sunshine 是串流的服务端,需要装在串流主机上。我是通过 scoop 安装的。 不过遇到了一个问题:moonlight 客户端无法访问。
一般无法访问服务,我都是按这个思路去排查:
一般说来,过了这三关,基本上大部分联机程序的问题都可以解决。不过很 显然 sunshine 这次,这三招都不好使。
我们再详细捋一下,看看这里面是不是有问题:
这个很好判断,打开任务管理器或者资源管理器,找对应名字的程序就是了:

找到以后,我们可以记一下 pid,这个后面我们会用到。
sunshine 监听的端口在它的 web ui 中就可以找到了:

然后我们可以命令行用 netstat -ano | findstr <pid> 来看一下端口的监听状态。

正常情况下,sunshine 的监听 ip 是四个零,这种写法表示无论我们连这台主机的哪一个 对外 ip,都应该是连得到。那么对于我们这次遇到的情况,应该也不是连接了未监听 的 ip 的问题。
应用和监听端口都排除,那基本上就只剩下防火墙了,当然还是有其他因素能够阻碍我们和 主机连接,比如我们和主机中间的网络设备,但是这些在家用环境下可以忽略,一来是正常 使用的情景,ISP 不会阻碍我们使用,二来如果它真的阻碍了,那我们也没有办法去解除。 所以我们只能在自己的设备上做文章。如果是其他应用场景,那么我们还需要排查链路上的 其他网络设备。
如果我们仔细阅读了 sunshine 的说明,对于添加防火墙例外规则, 其实 scoop 的 sunshine 很「贴心」地给我们准备了自动添加和删除的脚本:

scripts 目录中有一个 add-firewall-rule.bat,
它会把上层目录中的 sunshine.exe 加入防火墙例外。
而使用 scoop 的朋友们,我想大部分应该都是会使用
「~\scoop\apps\sunshine\current」这个目录,这其实不是一个目录,是一个软连接,
指向我们当前使用的 sunshine 版本。这种情况下,我们向防火墙中加入的,
也是一个软链接的路径。而软链接的路径对于防火墙来说是不起作用的,
它需要一个真实路径来验证是哪个程序,我这个情况,
就是向防火墙中加入了 current 路径的例外,
导致防火墙并没有放行访问 sunshine 的网络请求。
我细想了一下,可能有两个原因,一个是 windows 防火墙不支援软链接路径; 另一个是 sunshine 服务启动时使用的还是真实路径,所以防火墙规则失效了。 所以我们需要重建正确的防火墙规则。
重建防火墙规则不难,我们可以手动添加例外,也可以切到 sunshine 的实际路径,
再运行创建规则的脚本就好了,如果你和我一样还是喜欢用 current 目录,
可以用下面这个 powershell 命令轻松切换到 current 所指代的目录下:
# 假设当前路径(.)为 ~\scoop\apps\sunshine\current\scripts
cd (Get-Item .).Target[0]
现在再运行 add-firewall-rule.bat,就可以向防火墙添加正确路径的例外了,
不过需要记得两件事情:
sudo 运行脚本回头看整个事情,其实元凶是 scoop 的 current 路径机制和防火墙的不适配:
防火墙需要一个实际路径,而 scoop 的 current 目录是个软链接,
再加上 sunshine 的脚本并没有意识到这个问题,导致了我们没有办法连接 sunshine。
希望这篇可以帮助到一些朋友连上 sunshine 开心一下,细看每个细节, 感觉都没什么问题,但是合在一起,问题就出来了,你有没有遇到过这样的问题?