在家里自建了一个私人网络云盘,由于家里上网IP都是服务商动态分配的,所以公网IP地址是不固定的。这样在路由器上设置端口映射也没多少意义,得知道当时的公网IP才能访问;
于是就使用 frp(0.51.1),(当前最新版2023.7.25)做内网穿透。
也可以使用一些收费的内网穿透工具,如花生壳,神卓 等产品。(免费的限制挺在的),由于我自己有一个固定公网IP的电脑可以使用,所以就选择了免费开源的 frp 。
在使用过程中,发一个问题,frpc.exe 会经常莫名的退出了。很多时候,是不方便去重启frpc.exe 的。(比如我不在家的时候)
然后上官方( github.com/fatedier/frp )去查,也有人反馈问题,作者仿佛也很无奈的相子,此问题在2017年就提出来了,直至今天好象也没有得到解决;
于是又在网上看看别人是怎么解决的。看了后,多是使用 bat 方式进行“进程守护“
可是我不喜欢桌面出现一个 DOS控制台窗口。
于是看到有人介绍使用 winsw.exe 来将 frpc.exe 做成服务来运行。(虽然可以不出现DOS控制台窗口了,但是解决不到莫名的问题。再者winsw.exe 创建的服务真心运行缓慢,资源占用也很大。)
想着不就是一个进程守护嘛,非常简单,于是就自己动手写了一个程序;
原理也非常的简单。每隔5秒判断一下 frpc.exe进程是否存在,不存在就启动它。为了更好的做到无感,就把程序写成一个服务。
首先用 delphi 创建 个 Windows Service 工程,然后 放一个 timer 。定时为 5000 毫秒;
定时的运行下面代码
var
ContinueLoop :Boolean;
FSnapshotHandle:THandle;
FProcessEntry32:tProcessEntry32;
s,fn,FFileName:string;
b:Boolean;
FF:TextFile;
begin
b:=False;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while ContinueLoop do begin
s := ExtractFileName(FProcessEntry32.szExeFile);
if (s='frpc.exe') then begin
ContinueLoop := false;
b:=True;
Continue;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
SetCurrentDir(ExtractFilePath(ParamStr(0)));
if not b then begin
FFileName := ExtractFilePath(ParamStr(0)) + 'frpclog.log';
AssignFile(FF, FFileName);
if not FileExists(FFileName) then begin
Rewrite(FF);
end;
Append(FF);
Writeln(FF,FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',Now()));
Close(FF);
ShellExecute(0, 'open','frpc.exe','-c frpc.ini',nil,SW_HIDE);
end;
服务端也可以这么做。把相关的“写死”在代码里面的东西,弄一个配置,这样就灵活些了。
做了一个懒人包,可以去下载 frp内网穿透,解决客户端(frpc.exe)莫名退出后自动重启