自己动手实现动态外网ip管理和动态DNS域名解析
项目背景:
在自己的电脑装了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 "<b>IP Address= $ip</b>";
$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
)
<html>
<body>
CGi代码:
Update.php
<?php
$method = $_GET['m'];
if($method == "update"){
$ip=$_SERVER['REMOTE_ADDR'];
$uid = $_GET['uid'];
echo 'Got it:uid='.$uid.',ip='.$ip.'</BR>';
//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']."</BR></BR>";
}
if( $mysql->errno() != 0 )
{
die( "Error:" . $mysql->errmsg() );
}
$mysql->closeDb();
}
?>
</body>
</html>
用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
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\UpdateIp.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About UpdateIp"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
LTEXT "UpdateIp Version 1.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX
LTEXT "Copyright (C) 2012",IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "OK",IDOK,178,7,50,16,WS_GROUP
END
IDD_UPDATEIP_DIALOG DIALOGEX 0, 0, 144, 222
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "UpdateIp"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
PUSHBUTTON "停止服务",IDC_BTN_STOPSERVICE,81,89,50,14
PUSHBUTTON "启动服务",IDC_BTN_STARTSERVICE,17,89,50,14
CONTROL "随系统启动",IDC_CHECK_AUTOSTART,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,25,56,10
补充:软件开发 , C++ ,