-------------------------------------------------------------------------------

以下内容可能还是存在问题,等之后有时间再进行进一步确认。

-------------------------------------------------------------------------------

原先一直使用TP-LINK路由器本身自带的花生壳动态DNS加路由器的端口映射功能,可以从外网直接访问到到内网电脑端口。

后来发现花生壳提供的解析IP不能访问内网电脑了,经过一番检查,发现路由器中的外网IP与访问外网网页时所显示器的IP地址不一致,

使用访问网页时的IP测试不能访问到内网,使用路由器上显示器的外网IP倒是可以访问到内网,

应该是ISP提供商(本人用的是联通宽带)使用了NAT转换导致的。

又是一番调查,花生壳和其它的动态DNS服务提供商倒是提供了可能的解决方案,就是根据线路不同内部进行不同处理,

本人估计是可能可以解决NAT转换导致的IP地址问题,但是,最重要一点,这种服务是收费服务,只能另想办法了。

另外,在要映射端口的电脑上安装新花生壳客户端软件,此软件具有的内网映射功能应该可以实现对这种情况下对内网电脑端口的映射功能,只要付费1元就可以了,

不过这个功能实现可能是通过软件本身的中转实现,存在不少局限性,不过一般情况下的使用应该也没多大问题。

本人还是希望通过真实IP来进行访问,所以又进行调查,之后发现花生壳提供手动更新动态IP功能,也就是使用HTTP的GET方法来编程手动更新IP地址,

又调查发现应该可以从路由器的管理网页中得到外网IP,所以经过调查测试,确实可以实现,再加上软件中进行定时自动更新,可以实现类似花生壳客户端的自动更新IP功能。

将使用的主要代码【C#】记录如下:

        /// <summary>
/// 取得TP-LINK路由器的外网IP地址
/// 本函数假设路由器已处于连网状态,不再对是否连网状态进行判断
/// </summary>
/// <param name="strTPIP">TP-LINK路由器的IP地址</param>
/// <param name="strUserName">TP-LINK路由器的管理用户名</param>
/// <param name="strPassword">TP-LINK路由器的管理用户密码</param>
/// <returns>外网IP地址,为空表示获取失败</returns>
private string GetWanIP(string strTPIP, string strUserName, string strPassword)
{
// 包含TP-LINK路由器状态信息的网页URL
string strTPURL = "http://" + strTPIP + "/userRpm/StatusRpm.htm"; // 设置获取状态信息网页内容的相关参数
System.Net.HttpWebRequest objRequest = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(strTPURL);
objRequest.Referer = strTPURL;
objRequest.Credentials = new System.Net.NetworkCredential(strUserName, strPassword); // 取得结果信息内容
SetLogMessage(0, "尝试获取路由器状态信息内容");
System.Net.HttpWebResponse objResponse = (System.Net.HttpWebResponse)objRequest.GetResponse(); SetLogMessage(1, "已取得路由器状态信息");
// 取得结果内容文本
System.IO.StreamReader objResponseReader = new System.IO.StreamReader(objResponse.GetResponseStream(), Encoding.Default);
string strResponseText = objResponseReader.ReadToEnd();
objResponseReader.Close();
objResponse.Close(); // 查找包含外网IP地址的数据数组位置
SetLogMessage(1, "查找包含外网IP地址的数据数组位置");
int intPos = strResponseText.IndexOf("var wanPara = new Array");
if (intPos < 0)
{
SetLogMessage(0, "*** 查找包含外网IP地址的数据数组位置失败");
return "";
} // 查找外网IP地址位置
SetLogMessage(1, "查找外网IP地址位置");
int intPos2 = strResponseText.IndexOf("\",\n\"", intPos);
if (intPos2 < 0)
{
SetLogMessage(0, "*** 查找外网IP地址位置失败");
return "";
} // 查找外网IP地址结束位置
SetLogMessage(1, "查找外网IP地址结束位置");
int intPos3 = strResponseText.IndexOf("\"", intPos2 + 4);
if (intPos3 < 0)
{
SetLogMessage(0, "*** 查找外网IP地址结束位置失败");
return "";
} // 得到外网IP地址
int intIPPos = intPos2 + 4;
string strWanIP = strResponseText.Substring(intIPPos, intPos3 - intIPPos);
SetLogMessage(0, "得到结果外网IP地址:[" + strWanIP + "]"); return strWanIP;
} /// <summary>
/// 更新动态IP地址到花生壳
/// </summary>
/// <param name="strOrayUserName">花生壳用户名</param>
/// <param name="strOrayPassword">花生壳密码</param>
/// <param name="strHostName">花生壳域名(多个域名时用逗号隔开)</param>
/// <param name="strWanIP">要更新的IP,也可为空,为空时由花生壳得到的IP地址为准</param>
/// <returns>是否成功</returns>
private bool UpdateOrayDdnsIP(string strOrayUserName, string strOrayPassword, string strHostName, string strWanIP)
{
// 更新DDNS的URL
string strUpdateURL = "http://ddns.oray.com/ph/update?hostname=" + strHostName + "&myip=" + strWanIP; // 创建HTTP请求对象
System.Net.HttpWebRequest objRequest = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(strUpdateURL); // 设置相关参数
objRequest.UserAgent = "Oray";
objRequest.Method = "GET"; //获得用户名密码的Base64编码
string strBase64Code = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", strOrayUserName, strOrayPassword))); //添加Authorization到HTTP头
objRequest.Headers.Add("Authorization", "Basic " + strBase64Code); // 尝试更新并取得结果信息
SetLogMessage(0, "尝试更新动态IP到花生壳");
System.Net.HttpWebResponse objResponse = (System.Net.HttpWebResponse)objRequest.GetResponse(); // 得到结果信息文本
SetLogMessage(1, "更新动态IP到花生壳完成");
System.IO.StreamReader objResponseReader = new System.IO.StreamReader(objResponse.GetResponseStream(), Encoding.Default);
string strResponseText = objResponseReader.ReadToEnd();
objResponseReader.Close();
objResponse.Close(); SetLogMessage(0, "更新结果信息:[" + strResponseText + "]"); // 检查结果是否成功
if (strResponseText.IndexOf("good") >= 0 || strResponseText.IndexOf("nochg") >= 0)
{
SetLogMessage(1, "更新动态IP地址成功");
return true;
}
else
{
SetLogMessage(0, "*** 更新动态IP地址失败");
return false;
} }

以上代码只适用于TP-LINK路由器,在TP-LINK路由器TL-WR845N型号上测试通过,因为没有测试其它型号,所以不能保证其它型号的路由器可以正常使用。

如果TP-LINK其它型号路由器不能使用,可以查看状态显示器网页URL是否与上面代码中URL一致,并且使用HTTP抓包工具查看网页Header内容及Response内容,

对URL、进行GET时的Header内容以及Response的内容中的外网IP所在位置查找字符串方法进行调整,应该是可以实现的。

同理,对于其它厂商的路由器,本人感觉也是可以同样道理来实现,查看路由器状态信息页面源代码以及使用HTTP抓包工具查看相关信息,应该可以实现类似功能。

花生壳返回代码列表

参数 说明
good 更新成功,域名的IP地址已经更新,同时会返回本次更新成功的IP,用空格隔开,如:good 1.2.3.4
nochg 更新成功,但没有改变IP。一般这种情况为本次提交的IP跟上一次的一样
notfqdn 未有激活花生壳的域名
nohost 域名不存在或未激活花生壳
nochg 更新成功,但没有改变IP。一般这种情况为本次提交的IP跟上一次的一样
abuse 请求失败,频繁请求或验证失败时会出现
!donator 表示此功能需要付费用户才能使用,如https
911 系统错误 

参考资料:

花生壳HTTP协议说明:

http://open.oray.com/wiki/doku.php?id=%E6%96%87%E6%A1%A3:%E8%8A%B1%E7%94%9F%E5%A3%B3:http%E5%8D%8F%E8%AE%AE%E8%AF%B4%E6%98%8E

更新TP-LINK路由器的外网IP到花生壳动态IP解析的更多相关文章

  1. 花生壳动态IP域名解析之python自动提交公网IP

    #!/usr/bin/env python import re import os import time import random ip_current = '' while True: myip ...

  2. Android根据内网外网连接情况配置服务器访问IP

    新项目的app,可通过内网和外网的服务器ip进行请求访问,但是客户提供了专业终端,终端在wifi情况下走外网内网都可以,但关闭wifi则只能走4G专网,也就是只能走内网. 可前往我的小站查看:Andr ...

  3. 外网配置花生壳动态域名解析实现外网访问本地iis及vs实时调试

    描述:假如已连外网,具备一台路由器的情况下在路由器设置页面配置花生壳动态域名解析,使得外网可以访问到本地iis 托管的web服务,模拟真实环境调试应用程序. 网络运营商ip的动态分配,通常网络提供商给 ...

  4. NAT ------ 内网的主机如何通过路由器与外网的主机通信

    内网主机A,路由器B,外网主机C 使用了两个协议: 路由:位于网络层,为数据包提供一个寻径的算法,不改变数据包的源IP和目的IP,但是会修改源MAC和目的MAC,只在同个网段的进行数据的转发 NAT: ...

  5. CentOS 7运维管理笔记(11)----解决配置静态IP还是会出现动态IP地址的问题

    网上搜集CentOS7 配置静态IP的方法,基本上都是说在 /etc/sysconfig/network-scripts/ifcfg-eth0文件中做如下配置 TYPE=Ethernet HWADDR ...

  6. 更改路由器的外网IP

    此方法适用于通过路由器拨号上网的宽带,若宽带通过光猫拨号上网则需要将光猫改为桥接模式并在路由器中配置宽带账号和密码 测试环境: 路由器:TP-LINK TL-WDR7800千兆版 硬件版本:1.0 软 ...

  7. centos7配置静态ip后仍然显示动态ip

    我在虚拟机上安装了CentOS7操作系统,将 /etc/sysconfig/network-scripts/ifcfg-eth0 文件配置静态 IP 为192.168.1.210,如图1: 然后我用 ...

  8. 说一下怎么搭建外网来访问SVN服务器

    一.搭建SVN服务器 1.所需软件 TortoiseSVN,下载地址http://tortoisesvn.net/downloads.html TortoiseSVN中文语言包,下载地址http:// ...

  9. C#获取路由器外网IP,MAC地址

    C#实现的获取路由器MAC地址,路由器外网地址.对于要获取路由器MAC地址,一定需要知道路由器web管理系统的用户名和密码.至于获取路由器的外网IP地址,可以不需要知道路由器web管理系统的用户名和密 ...

随机推荐

  1. 最长递增子序列问题—LIS

    问题:给定一组数 a0,a0,....,an-1. 求该序列的最长递增(递减)序列的长度. 最长递增子序列长度的求法有O(n^2)和O(nlogn)两种算法. 1.复杂度为O(n^2)的算法. 设L[ ...

  2. Redis 架构设计

    1.设计层面 (1) 存储小而热的数据 (2) 结合业务数据特点,正确使用内存类型 (3) 冷.热数据分离 2.架构层面 (1) 提前做好容量(内存)规划 (2) 结合持久化模式优劣正确使用,一般建议 ...

  3. leetcode 46-Permutations and 47-Permutations II

    Permutations Given a collection of numbers, return all possible permutations. For example, [1,2,3] h ...

  4. 命令行运行java

    运行TestLinuxCommand.java     代码 import java.io.BufferedReader; import java.io.BufferedWriter; import ...

  5. [水]ZOJ1201

    给原排列 求 其前面有多少个数比他大. 给每一个数1...2..n前面有多少个数比他大,求原序列 第一个直接统计 第二个从1開始找出第inv[i]+1个空位置放进去就好 printf里的format ...

  6. Struts2学习一----------Struts2的工作原理及HelloWorld简单实现

    © 版权声明:本文为博主原创文章,转载请注明出处 Struts2工作原理 一个请求在Struts2框架中的处理步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2.这个请求 ...

  7. 有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值。 给定数组A及它的大小n,请返回最大差值。

    // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...

  8. Gmail上不去怎么办?

    近期非常多人反映Gmail上不去.每到重大政治事件附近,国家的防火墙就会加固一些. 事实上仅仅要下一个软件就能够轻松解决Google.Gmail上不去的问题. 下载地址 下载解压后点击"我要 ...

  9. Unable to save settings: Failed to save settings. Please restart PyCharm解决

    将工程的.ideas目录删掉,重启pycharm即可.

  10. XMPP协议概述

    XMPP(Extensible Messaging and Presence Protocol,前称Jabber)是一种以 XML 为基础的开放式实时通信协议,关于它的协议细节,网上已经有太多分析文章 ...