此文章已有新文章发布,请移步:http://www.yxxrui.cn/article/179.shtml
如需下载安装包和完整源码,可以扫描关注以下二维码获取
===================================================
未经许可请勿转载,如有疑问,请联系作者:yxxrui@163.com
公司的网络没有固定的公网IP地址,但是能够保证的是,每次动态分配的IP地址均为独立的公网IP,只是每次分配后会在1-2天后更换,或者重启路由器后更换,为了能够把这个公网IP利用起来,大家常用的是使用花生壳之类的软件来操作,我使用过花生壳的多款产品,挺好的,就是有一下几个缺点:
1、需要使用花生壳上购买的域名才行,或者使用免费的可域名,其丑无比
2、不稳定,也很慢
但是为了解决问题,我开始摸索自己搞定它,公司域名从阿里云上购买,阿里云提供云解析技术免费版,提供通过api来管理域名的功能,当我看到该文档的时候直接就看到了希望,解决起来绝对没问题了。
首先需要确认一下,有两种情况:
1、公司服务器直接接入网线,这个时候服务器的IP就是公网IP
2、公司服务器链接公司路由器,路由器链接网线,这个时候路由器上是公网IP,而服务器上是局域网IP
第一种情况最简单了,不需要设置什么了,第二种情况需要到路由器设置界面设置端口转发或者直接将全部端口映射到内网的服务器IP上,这样的话,访问公网IP时相当于访问内网IP,比如路由器IP为125.120.83.30,内网IP为192.168.168.168。可以将路由器中80端口映射到192.168.168.168的80端口上。
到阿里云控制台申请accessKeyId和accessKeySecret,用来调用API的,为了简单起见,先给域名添加一条解析记录,这样就不需要在程序里判断该域名是否已创建,然后可以直接修改解析记录了。比如我的域名为yxxrui.cn,记录值为blog,也就是要把子域名blog.yxxrui.cn指向我自己电脑125.120.83.30上。
下边直接贴出代码:
class Program
{
private static string regionId = "cn-hangzhou";
private static string accessKeyId = "Ydjakdfdsadfd";//换成自己的
private static string accessKeySecret = "wfdg89ds8fdkfasdfyaiusfdasf";//换成自己的
private static string recordId = "4685613245468132";//blog.yxxrui.cn的唯一记录ID
//或者设置为空,然后下边有从阿里云获取的方法,只是不建议每次都去阿里云获取。
private static string domain = "yxxrui.cn";
private static string rr = "blog";//子域名
private static string filename = "C:/yxxrui/ip.dat";//缓存IP保存的位置
private static readonly IClientProfile ClientProfile =
DefaultProfile.GetProfile(regionId, accessKeyId,accessKeySecret);
private static readonly IAcsClient Client = new DefaultAcsClient(ClientProfile);
static void Main(string[] args)
{
//为了加快速度,此处获取到recordId之后就保存起来,以后不再请求阿里云接口
/*recordId = GetRecordId(domain, rr);
if (recordId == "") return;*/
//获取成功,并且有变化时
string lastIp = Read();
string curIp = GetIp();
if (!curIp.Equals("") && !lastIp.Equals(curIp))
{
var request = new UpdateDomainRecordRequest
{
RecordId = recordId,
RR = rr,
Type = "A",
Value = curIp,
TTL = 600,//我的是免费版,最小为10分钟,600秒
Priority = 10
};
Client.DoAction(request);
Write(curIp);//更新成功后保存IP地址到本地
}
}
private static string GetRecordId(string domain,string rr)
{
DescribeDomainRecordsRequest reqq = new DescribeDomainRecordsRequest
{
DomainName = domain,
RRKeyWord = rr
};
var rss = Client.GetAcsResponse(reqq);
foreach (var record in rss.DomainRecords)
{
if (record.DomainName.Equals(domain) && record.RR.Equals(rr))
{
return record.RecordId;
}
}
return "";
}
public static string Read()
{
FileInfo file = new FileInfo(filename);
if (!file.Exists)
{
Write("尚未获取");
}
StreamReader sr = new StreamReader(filename, Encoding.Default);
string res = "";
String line;
while ((line = sr.ReadLine()) != null)
{
res += line;
}
sr.Close();
return res;
}
public static void Write(string ip)
{
FileStream fs = new FileStream(filename, FileMode.Create);
//获得字节数组
byte[] data = Encoding.Default.GetBytes(ip);
//开始写入
fs.Write(data, 0, data.Length);
//清空缓冲区、关闭流
fs.Flush();
fs.Close();
}
private static string GetIp()
{
string ip = "";
try
{
WebClient myWebClient = new WebClient {
Credentials = CredentialCache.DefaultCredentials
};
//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
Byte[] pageData = myWebClient.DownloadData(
"http://www.yxxrui.cn/yxxrui_cabangs_api/myip.ashx");
string pageHtml = Encoding.Default.GetString(pageData);
//如果获取网站页面采用的是GB2312,则使用这句
//string pageHtml = Encoding.UTF8.GetString(pageData);
//如果获取网站页面采用的是UTF-8,则使用这句
return pageHtml;
}
catch (WebException webEx)
{
}
return ip;
}
}
为了更好的获取IP地址,我专门写了一个简单页面,访问该页面后返回您的外网IP
http://www.yxxrui.cn/yxxrui_cabangs_api/myip.ashx
该代码为C#代码,建议将项目设置为winform程序,不要设置为控制台程序,否则每次执行时会弹出黑色的控制台,很恶心人的。该代码未实现自动检测和执行(如需程序创建计划任务,可联系我),只是做了以下工作:
1、获取当前公网IP
2、查看当前IP是否有变化
3、无变化直接退出,又变化则修改域名解析设置
这些还不够,通过使用window 操作系统中的任务计划程序,制定计划,每(1)分钟执行该软件一次即可。
需要引入阿里云提供的SDK(我已编译好了):阿里云域名解析SDK.zip
未经许可请勿转载,如有疑问,请联系作者:yxxrui@163.com
原文地址:http://www.yxxrui.cn/article/116.shtml
若需要子域名解析的本人可免费提供(拒绝一切违反法律和道德的网络信息)。
原创文章如转载,请注明出处“
伊人博客”