项目背景:
在自己的电脑装了linux 虚拟机,想要在外网也能ssh到虚拟机进行开发,由于路由ip是动态ip,想到网上找一些动态dns域名解析,但是效果不大好,所以想到自己进行外网ip的管理。
想法:
用C++写一个界面客户端,随系统启动,定时访问自己的cgi,更新自己的外网ip;这个客户端能支持简单的几个操作:启动,退出,设置更新间隔,是否随系统启动等。
写一个cgi,接收client请求,并记录最新的外网ip到数据库;
写另外一个cgi,在其他地方访问能列出当前最新的外网ip,以及历史ip列表。
可以再写一个跳转cgi:jump.php,访问这个cgi能够自动跳转到最新的外网ip对应的目录。
至此,一个简单的动态ip管理和dns解析功能就完成了。
编程环境选择:
Server:Php+Mysql,服务器使用sina云平台。
项目进度:
编写CGI,updateip.php m=update&uid=实现更新外网ip到数据库。
Php中获取ip的方式:
echo "IP Address= $ip";
$ip=$_SERVER['REMOTE_ADDR'];
数据库设计:
Iplist:
建表:
Create table iplist(id int not null auto_increment,
Primary key(id),
uid VARCHAR(32),
ip VARCHAR(32),
updatetime datetime
)
CGi代码:
Update.php
< php
$method = $_GET['m'];
if($method == "update"){
$ip=$_SERVER['REMOTE_ADDR'];
$uid = $_GET['uid'];
echo 'Got it:uid='.$uid.',ip='.$ip.'';
//mysql_connect($_SAE_MYSQL_HOST_M,$_SAE_MYSQL_USER, $_SAE_MYSQL_PASS) or die(mysql_error());
//mysql_select_db($_SAE_MYSQL_DB) or die(mysql_error());
// Create a MySQL table in the selected database
$mysql = new SaeMysql();
$sql = "INSERT INTO `iplist` (`id`, `uid`, `ip`, `updatetime`) VALUES (NULL, '".$uid."', '".$ip."', now());";
$mysql->runSql( $sql );
if( $mysql->errno() != 0 )
{
die( "Error:" . $mysql->errmsg() );
}
$mysql->closeDb();
}else{
$mysql = new SaeMysql();
$sql = "SELECT *
FROM `iplist`
ORDER BY `updatetime` DESC";
$data = $mysql->getData( $sql );
foreach($data as $i => $value){
echo "Record:id=".$value['id'].",uid=".$value['uid'].",ip".$value['ip'].",updatetime".$value['updatetime']."";
}
if( $mysql->errno() != 0 )
{
die( "Error:" . $mysql->errmsg() );
}
$mysql->closeDb();
}
>
用MFC编写一个简单的客户端,开机自动启动,定时请求服务器更新外网ip

client端主要代码,基于VS2005,MFC:
UpdateIp.rc
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"
"LANGUAGE 4, 2\r\n"
"#pragma code_page(936)\r\n"
"#include ""res\\UpdateIp.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""afxres.rc"" // Standard components\r\n"
"#endif\r\n"
"\0"
END