natapp自动获取免费的动态端口域名
前段时间,因为客户有个项目要求跨局域网进行远程控制桌面,想知道能不能实现。于是查询了许多资料,了解到需要有公网服务器作为中介才能够实现,但是公司又没有公网服务器,于是只有利用花生壳、natapp服务器实现内网穿透服务。但是这些都要收费,免费的域名和端口是随机变动的,对于测试相当不方便。于是就想设计一款工具能够自动获取natapp产生的动态域名与端口。申请natapp的账号及隧道这里就不用介绍,网上资料一大把,官网也有:https://natapp.cn/article/natapp_newbie可以申请到三个免费不同协议的隧道WEB,TCP,UDP。
配置好cogfig.ini文件后,Natapp.exe运行起来界面是这样的,我们需要的是Forwarding后面的值, 刚开始想利用图像处理的

方式进行OCR文字识别,但是Tesseract的识别率太低,训练可以提高准确率,但是也比较麻烦,于是半途还是放弃了。功夫不负有心人,摸索半天被我寻找到了其他的方法。根据config.ini文件介绍,尝试使用了Log的功能,想看看log里面都有些啥。原来在Debug日志里面,记录了得到的所有消息。这样就有办法进行自动获取了。


下面看具体执行步骤吧:
1.首先将官网下载的Natapp.exe文件放置到一目录下
2.然后打开本工具,选取文件所在地址,如下图:
3.填入natapp提供的authtoken,点击解析,经过2s左右即可获取域名端口

WEB协议:
TCP协议:
UDP:协议
以上,是测试步骤,调用了本人封装好的DLL,在自己的项目中引用时,只需要提供authtoken,协议类型以及natapp文件的地址即可获取。后台会自动打开natapp服务,没有任何窗体展示。
下面开始重点了,DLL源码放送:
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace NatappToolDll
{
/// <summary>
/// 通道协议
/// </summary>
public enum TunnelingProtocol
{
WEB = 0,
TCP = 1,
UDP = 2
}
public class NatappResolve
{
Process process;
static string logPath = "log.txt";
/// <summary>
/// 开始解析
/// </summary>
/// <param name="natappDir">natapp.exe目录</param>
/// <param name="authtoken">authtoken码</param>
/// <param name="domainNameAndPort">域名和端口号</param>
/// <returns></returns>
public bool StartResolve(string natappDir, string authtoken, TunnelingProtocol tunnelingProtocol, out ResolveResult resolveResult)
{
resolveResult = new ResolveResult();
try
{
//【1】创建配置文件
string natappFilePath = natappDir + "\\natapp.exe";
if (File.Exists(natappFilePath) && authtoken != "")
{
CreatConfigureFile(natappDir, authtoken);
}
else
return false;
//【2】打开natapp.exe
StartNatapp(natappFilePath);
Thread.Sleep(1000);
//【3】分析日志
using (FileStream fs = new FileStream(logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default))
{
StringBuilder sb = new StringBuilder();
while (!sr.EndOfStream)
{
sb.AppendLine(sr.ReadLine() + "<br>");
}
string str = sb.ToString();
int x = str.IndexOf("Url"); //定位位置
string validData = str.Substring(x, 100);
string[] strTmps = validData.Split('"');
string[] serverStr = strTmps[2].Split(':');
resolveResult.serverUrl = serverStr[0] + ":" + serverStr[1];
if (tunnelingProtocol == TunnelingProtocol.TCP || tunnelingProtocol == TunnelingProtocol.UDP)
resolveResult.serverPort = int.Parse(serverStr[2]);
resolveResult.localIP = strTmps[10].Split(':')[0];
resolveResult.localPort = int.Parse(strTmps[10].Split(':')[1]);
return true;
}
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// 删除日志文件
/// </summary>
/// <param name="directoryPath"> 文件夹路径 </param>
/// <param name="fileName"> 文件名称 </param>
public static void DeleteFolder()
{
DirectoryInfo di = new DirectoryInfo(Application.StartupPath);
FileInfo[] fis = di.GetFiles();
foreach (FileInfo fi in fis)
{
try
{
if (fi.Name.Contains(logPath))
{
fi.Delete();
}
}
catch (Exception ex)
{
}
}
}
/// <summary>
/// 创建natapp的配置文件config.ini
/// </summary>
/// <param name="dirPath"></param>
/// <param name="authtoken"></param>
/// <param name="clienttoken"></param>
/// <param name="logFilePath"></param>
/// <param name="loglevel"></param>
/// <param name="httpProxy"></param>
private void CreatConfigureFile(string dirPath, string authtoken, string clienttoken = null)
{
string filePath = dirPath + "\\config.ini";
try
{
FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
StringBuilder sb = new StringBuilder();
sb.AppendLine("[default]");
sb.AppendLine("authtoken=" + authtoken);//对应一条隧道的authtoken
sb.AppendLine("clienttoken=" + clienttoken);//对应客户端的clienttoken,将会忽略authtoken,若无请留空
sb.AppendLine("log=" +logPath);//log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
sb.AppendLine("loglevel=DEBUG");//日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
sb.AppendLine("http_proxy=");//代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空
string str = sb.ToString(); ;
byte[] data = System.Text.Encoding.Default.GetBytes(str);
//开始写入
fs.Write(data, 0, data.Length);
//清空缓冲区、关闭流
fs.Flush();
fs.Close();
}
catch(Exception ex)
{
}
}
/// <summary>
/// 打开natapp.exe 并嵌套到本程序窗体内
/// </summary>
private void StartNatapp(string appPath)
{
KillProcess("natapp");
DeleteFolder();
process = null;
process = new Process();
process.StartInfo.FileName = appPath; // 需要启动的程序
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; // 为了美观,启动的时候最小化程序
process.Start();
Thread.Sleep(1000); // 这里必须等待,否则启动程序的句柄还没有创建,不能控制程序
}
/// <summary>
/// 关闭进程
/// </summary>
/// <param name="processName">进程名</param>
private void KillProcess(string processName)
{
Process[] myproc = Process.GetProcesses();
foreach (Process item in myproc)
{
if (item.ProcessName == processName)
{
item.Kill();
}
}
}
/// <summary>
/// 关闭natapp服务
/// </summary>
public void CloseNatappServer()
{
KillProcess("natapp");
}
}
}
域名端口类:
namespace NatappToolDll
{
public class ResolveResult
{
/// <summary>
/// 服务器域名
/// </summary>
public string serverUrl { get; set; }
/// <summary>
/// 服务器端口
/// </summary>
public int? serverPort { get; set; }
/// <summary>
/// 本地地址
/// </summary>
public string localIP { get; set; }
/// <summary>
/// 本地端口
/// </summary>
public int localPort { get; set; }
}
}
调用方法:引用NatappToolDll.dll,执行以下方法即可获取:
private void btnStartWeb_Click(object sender, EventArgs e)
{
string _natappPath = tbNatappAddress.Text;
string _authtoken = tbAuthtokenWeb.Text;
tbProtocol.Text = "WEB";
StartResolve(_natappPath, NatappToolDll.TunnelingProtocol.WEB,_authtoken);
}
/// <summary>
/// 开始解析
/// </summary>
/// <param name="natappPath"></param>
/// <param name="authtoken"></param>
public void StartResolve(string natappPath, NatappToolDll.TunnelingProtocol tunnelingProtocol, string authtoken)
{
NatappToolDll.ResolveResult rr = new NatappToolDll.ResolveResult();
bool res = natappResolve.StartResolve(natappPath, authtoken, tunnelingProtocol, out rr);
tbServerUrl.Text = rr.serverUrl;
tbServerPort.Text = rr.serverPort.ToString();
tbLocalIP.Text = rr.localIP;
tbLocalPort.Text = rr.localPort.ToString();
}
源码地址:https://github.com/FreshBreezes/NatappAutoGetUrl.git
使用本工具可方便个人学习,避免每次开启程序需要手动添加域名和端口的麻烦,如果觉得好用,请多多鼓励!
natapp自动获取免费的动态端口域名的更多相关文章
- node获取本机动态IP,并对应修改相关JavaScript文件的IP地址
目录 由于本机是自动获取分配的动态IP,所以每次重启后需要重新更改与IP相关文件 参考 时间:2018-08-02,更新时间:2018-11-06 注意:在win10环境运行无问题 由于本机是自动获取 ...
- 基于jquery的表格动态创建,自动绑定,自动获取值
最近刚加入GUT项目,学习了很多其他同事写的代码,感觉受益匪浅. 在GUT项目中,经常会碰到这样一个问题:动态生成表格,包括从数据库中读取数据,并绑定在表格中,以及从在页面上通过jQuery新增删除表 ...
- 从零到一快速搭建个人博客网站(域名自动跳转www,二级域名使用)(二)
前言 本篇文章是对上篇文章从零到一快速搭建个人博客网站(域名备案 + https免费证书)(一)的完善,比如域名自动跳转www.二级域名使用等. 域名自动跳转www 这里对上篇域名访问进行优化,首先支 ...
- SSH 动态端口forwarding是如何工作的
好久没有来了,实在是太懒. 经常用SSH的动态端口forwarding 来FQ,使用像这样的命令: ssh -D 9999 -f -C -q -N sshHost.somewhere.com 这个命令 ...
- 转载-centos网络配置(手动设置,自动获取)的2种方法
转载地址:http://blog.51yip.com/linux/1120.html 重新启动网络配置 # service network restart 或 # /etc/init.d/networ ...
- Oracle VM Virtual 下CentOS不能自动获取IP地址
在CentOS配置网卡开机自动获取IP地址: vi /etc/sysconfig/network-scripts/ifcfg-eth0 将 ONBOOT="no" 改为 ONBOO ...
- linux如何自动获取ip地址
第一步:激活网卡 系统装好后默认的网卡是eth0,用下面的命令将这块网卡激活. # ifconfig eth0 up 第二步:设置网卡进入系统时启动 想要每次开机就可以自动获取IP地址上网,就要设置网 ...
- centos网络配置方法(手动设置,自动获取)
不知道为什么最近一段时间网络特别的慢,还老是断,断的时候,局域网都连不上,当我手动设置一下ip后就可以了,搞得我很无语.下面是2种设置网络连接的方法,在说怎么设置前,一定要做好备份工作,特别是对于新手 ...
- delphi 自动获取串口
delphi 自动获取串口 https://blog.csdn.net/Nevermore_anger/article/details/79012875 版权声明:本文为博主原创文章,未经博 ...
随机推荐
- Python与JAVA的异同
--效率: 作为静态语言的JAVA执行效率比动态型语言的Python高 --语法: Python语句更精简. JAVA中的所有变量需要先声明(类型),才能使用,Python不需要声明变量类型 Pyth ...
- Android中查看当前Activity是否销毁
进入到Android-sdk中platform-tools目录 在命令行中执行以下命令 adb shell dumpsys activity>activity.txt 可以将当前的四大组件(Ac ...
- Linux之-命令
安装xshell http://jingyan.baidu.com/article/1612d500af1c97e20e1eee25.html 1.帮助命令 man:获得某个命令的说明和使用方式的详细 ...
- P1523 旅行商简化版
P1523 旅行商简化版 题目背景 欧几里德旅行商(Euclidean Traveling Salesman)问题也就是货郎担问题一直是困扰全世界数学家.计算机学家的著名问题.现有的算法都没有办法在确 ...
- delete 和 splice 删除数组中元素的区别
delete 和 splice 删除数组中元素的区别 ` var arr1 = ["a","b","c","d"]; d ...
- 2、Appium Desktop 使用介绍
1.appium运行界面介绍 默认显示监控的 host 和 port , 这和 Appium-Server 中是一致的. 2.点击 “Start Server V 1.7.2” 按钮启动服务,出现如 ...
- Java 反射获取私有方法
通常我们创建一个类时,它的私有方法在类外是不可见的,但是可以通过反射机制来获取调用.具体的反射机制的介绍大家自己百度. 所以反射可能会破坏我们的单例模式,当然解决方案也是有的,就是做个标记记录次数,第 ...
- centos_mysql踩坑
1 mysql安装 a: #wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm b:rpm -ivh mysq ...
- Python翻译
translator.py # -*- coding: utf-8 -*- # author: inspurer(月小水长) # pc_type lenovo # create_time: 2019/ ...
- mysql-python不支持python3
使用Mysqlclient pip3 install Mysqlclient