為了給用戶更好的服務,現在很多軟件都提供檢查在線升級的功能。
要實現這個功能,普遍的方法是利用 ftp空間,ftp空間里面存放了信息配置文件以及升級文件。程序一般會從空間上先下載一個存儲升級信息的配置文件。通過讀取這個配置文件,判斷是否要進行程序升級、更新。如果要更新,則會通過配置文件中指定的下載地址去下載升級文件。
例如:ftp 上存放的配置文件如下【Upate.ini】:
[Version]
Version=12
[URL]
URL=http://www.zg4o1577.cn/123.exe
那么程序會先下載 Upate.ini 文件,然后將自己的版本號與配置文件中的 Version 對比,如果是這個版本號,說明沒有更新。如果比它小,則說明需要更新,讀取URP 下載地址,進行下載升級文件。
如果我們有更新了程序,版本為 13, 則可以修改配置文件,再上傳到 ftp 空間上。程序就能自動檢測到文件更新了。
上面介紹的這種方式,比較通用適合免費的FTP空間。
還有一種方式,使用匿名FTP在程序里獲取版本信息文件。不必下載配置文件。不過不適合免費的FTP空間。但是免費的FTP空間不太安全。我就遇到過空間被不定時無故關閉,官方稱提供免費的服務器訪問量太大暫時關閉部分空間緩解壓力。建議我升級付費空間就不存在此問題。還有一個問題就是自己的靜態網站上被掛馬了!我靠!靜態網站總不可能被注入什么的吧?
如果自己搭建FTP空間也行,但是考慮到 ADSL 的上下行不對稱。我不建議這樣做。
前面說了一大堆都是說更新的方法,免費FTP空間不安全,如果為了一些練習作品去購買付費空間貌似又不太值。那怎么辦呢?我之前就一直糾結這個問題。
如今突然有靈感了,在不需要購買付費的FTP空間或不使用不安全的免費FTP空間的前提下設計了這個 Auto_Update V1.0 程序。

這個程序的功能很簡單,就是接受用戶的更新信息,回饋升級文件的下載地址。。
我們先添加程序的升級列表再把升級文件上傳到網盤里,就會回饋升級文件的網盤下載地址(支持外鏈的更好,知道的話順便告訴我一聲哈)。
設置服務端的方法:
先去3322 或 花生殼 申請一個免費的動態域名,有路由的朋友先在路由上設置端口映射和自動更新動態域名(路由都具備這些功能)。如果沒有路由的朋友直接下載3322 或花生殼的客戶端程序,登錄后 它會自動指向你的外網ip。 這個目的是為了,讓你的程序通過這個域名獲取到你的IP。因為ADSL 的IP是會變的。
然后運行Auto_Update V1.0程序,在Auto_Update V1.0 填入你的域名和端口。然后點擊【添加/刪除】按鈕,添加你的升級列表。升級列表里寫入你的低版本程序名 相對應的新版本的程序名以及下載地址。這樣才能讓Auto_Update 才能知道是哪個程序要升級哪個版本以及下載地址是什么。這樣就可以準確回饋給相應的用戶,不會在多個程序間出現混亂。這個程序支持 260 個不同的程序升級記錄。

你的程序升級模塊添加代碼方法:
先點擊Auto_Update V1.0 上的【生成文件】按鈕,Auto_Update V1.0 會在自身目錄下生成一個 AutoUpdateClient.h 頭文件和 TestUpdate.cpp 例程文件
AutoUpdateClient.h:提供了一個 核心的AutoUpade()函數接口。用來連接 Auto_Update V1.0 獲得升級信息。具體使用方法可以看看頭文件里面的注釋。
TestUpdate.cpp:是一個調用例程。
TestUpdate.cpp:
=================================================================
// 升級必須要的頭文件和鏈接庫
#include <WINSOCK2.H>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>
#include <stdio.h>
// 升級函數
#include "AutoUpdateClient.h"
/************************************************************************
* 參數:模式 0:實時檢查 1:檢查一次
/************************************************************************/
void Updatee(int MS)
{
// 服務器域名地址
char HostNmane[] = "lovemengx.vicp.net";
// 發送自身版本信息及接受新版本的信息
char Rname[MAX_PATH] = "TestUpdate V1.0";
// 接受下載地址
char Download[MAX_PATH] = {0};
// 臨時緩沖區
char Temp[MAX_PATH] = {0};
// 服務器端口
int Port = 1230 ;
while(1)
{
// 返回 0 則表示 檢測到新版本
if (!AutoUpade(HostNmane, Port ,Rname,Download))
{
sprintf(Temp, "程序檢測到最新版本:%s\t\n\n下載地址是:%s\t", Rname, Download);
if (IDYES == ::MessageBox(0,Temp , "檢測到新版本程序~~", MB_YESNO | MB_ICONQUESTION | MB_SYSTEMMODAL))
{
ShellExecute(NULL, "open", Download, NULL, NULL, SW_SHOWNORMAL);
}
else
{
exit(0);
}
}
// 如果模式是 非實時檢查則跳出循環結束檢查
if(MS)
break;
}
}
/************************************************************************/
/* 一個實時檢查升級的例子 */
/************************************************************************/
void SSJC()
{
puts("**************************************************************");
puts("這是個實時檢查自動升級的例子...");
puts("你可以根據自己所需修改...");
puts("**************************************************************");
puts("已經啟動實時檢查升級...");
CreateThread(0,0,(LPTHREAD_START_ROUTINE)Updatee,0,0,0);
}
/************************************************************************/
/* 一個啟動立即檢查升級的例子 */
/************************************************************************/
void YUpate()
{
puts("**************************************************************");
puts("這是個啟動時檢查升級的例子...");
puts("**************************************************************");
puts("已經啟動檢查升級...");
Updatee(1);
}
void main()
{
int i=0;
puts("***************************************************************");
puts(" 1:啟動時檢查一次升級例子");
puts(" 2:實時檢查升級例子");
puts("");
puts("【兩個例子都調用了 AutoUpade() 這個函數來獲取服務器的升級信息】");
puts("***************************************************************");
puts("請選擇:");
scanf("%d", &i);
if (i == 1)
{
puts("你選擇了【啟動時檢查一次升級例子】");
YUpate();
}
else
{
puts("你選擇了【實時檢查升級例子】");
SSJC();
Sleep(1000000);
}
}
========================================================================
實驗圖:


|