自己动手实现动态外网ip管理和动态DNS域名解析 (一)

2014-11-24 12:06:12 · 作者: · 浏览: 1

项目背景:

在自己的电脑装了linux 虚拟机,想要在外网也能ssh到虚拟机进行开发,由于路由ip是动态ip,想到网上找一些动态dns域名解析,但是效果不大好,所以想到自己进行外网ip的管理。

想法:

C++写一个界面客户端,随系统启动,定时访问自己的cgi,更新自己的外网ip;这个客户端能支持简单的几个操作:启动,退出,设置更新间隔,是否随系统启动等。

写一个cgi,接收client请求,并记录最新的外网ip到数据库

写另外一个cgi,在其他地方访问能列出当前最新的外网ip,以及历史ip列表。

可以再写一个跳转cgi:jump.php,访问这个cgi能够自动跳转到最新的外网ip对应的目录。

至此,一个简单的动态ip管理和dns解析功能就完成了。

编程环境选择:

Client:C++,MFC;

Server:Php+Mysql,服务器使用sina云平台。

项目进度:

编写CGI,updateip.php m=update&uid=实现更新外网ip到数据库

Php中获取ip的方式:

$ip=@$REMOTE_ADDR;

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