main.cpp
上传用户:wangying89
上传日期:2007-01-07
资源大小:61k
文件大小:12k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. /* sample of file wzjf.ver:
  2. 134.104.9.165  /caijia/cai_ji/datas/data06/success
  3. N2.H01
  4. N4.H01
  5. NH.H01
  6. */
  7. #include <windows.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <time.h>
  11. #include <ras.h>
  12. #include "resource.h"
  13. #include "tcp.h"
  14. #include "ftp.h"
  15. char hostname[20];
  16. #define UPDATE_PORT 7788
  17. #define P_VERSION_FILE "wzjf.ver"
  18. char app_name[100], host[20], path[128], version[20], new_version[20];
  19. char init_file[128];
  20. HANDLE hThread_app =NULL, hProcess_app =NULL;
  21. HWND g_hDlg =NULL;
  22. int g_fconnected =false;
  23. HRASCONN g_hRasConn =NULL;
  24. char new_file_name[100][128];
  25. int TransNewFiles(HWND hDlg);
  26. int CheckNewFiles(HWND hDlg);
  27. int sd, new_file_count =0;
  28. void log_msg(char *msg);
  29. int show_msg =0;
  30. int run_app();
  31. int term_app();
  32. int day_is_changed();
  33. int run_dial();
  34. void run_hangup();
  35. void SetState(char *msg);
  36. void WINAPI RasDialFunc(UINT msg, RASCONNSTATE state, DWORD dwError);
  37. time_t start_t =0;
  38. int f_auto_hide =0;
  39. int f_auto_hangup =0;
  40. BOOL CALLBACK MainDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  41. {
  42. int x, y;
  43. RECT rc;
  44. char temp[100];
  45. static int f_first =1;
  46. switch(msg)
  47. {
  48. case WM_INITDIALOG:
  49. g_hDlg =hDlg;
  50. GetWindowRect(hDlg, &rc);
  51. x =GetSystemMetrics(SM_CXSCREEN);
  52. y =GetSystemMetrics(SM_CYSCREEN);
  53. x =x/2-(rc.right-rc.left)/2;
  54. y =y/2-(rc.bottom-rc.top)/2;
  55. if(GetPrivateProfileString("update", "app", NULL, app_name, sizeof(app_name), init_file) ==0)
  56. app_name[0] =0;    // 不执行计费程序
  57. if(GetPrivateProfileInt("update", "autohide", 0, init_file) !=0)
  58. {
  59. f_auto_hide =1;    // 做完后自动隐藏
  60. CheckDlgButton(hDlg, IDK_AUTOHIDE, BST_CHECKED);
  61. }
  62. if(GetPrivateProfileInt("update", "autohangup", 0, init_file) !=0)
  63. {
  64. f_auto_hangup =1;    // 退出时自动断开
  65. CheckDlgButton(hDlg, IDK_AUTOHANGUP, BST_CHECKED);
  66. }
  67. SetWindowPos(hDlg, HWND_TOPMOST, x, y, 0, 0, SWP_NOSIZE);
  68. SetTimer(hDlg, 1, 0, NULL);
  69. return TRUE;
  70. case WM_KEYDOWN:
  71. switch(wParam)
  72. {
  73. case VK_ESCAPE:
  74. ShowWindow(hDlg, SW_MINIMIZE);
  75. break;
  76. case VK_F3:
  77. run_hangup();
  78. break;
  79. case VK_F1:
  80. WinExec("notepad update.log", SW_SHOWNORMAL);
  81. break;
  82. }
  83. break;
  84. case WM_COMMAND:
  85. switch(LOWORD(wParam))
  86. {
  87. case IDK_AUTOHIDE:
  88. if(HIWORD(wParam) ==BN_CLICKED)
  89. {
  90. if(SendMessage((HWND)lParam, BM_GETCHECK, 0, 0L) ==BST_CHECKED)
  91. f_auto_hide =1;
  92. else f_auto_hide =0;
  93. }
  94. break;
  95. case IDK_AUTOHANGUP:
  96. if(HIWORD(wParam) ==BN_CLICKED)
  97. {
  98. if(SendMessage((HWND)lParam, BM_GETCHECK, 0, 0L) ==BST_CHECKED)
  99. f_auto_hangup =1;
  100. else f_auto_hangup =0;
  101. }
  102. break;
  103. case ID_HIDE:
  104. ShowWindow(hDlg, SW_HIDE);
  105. break;
  106. case IDOK:
  107. ShowWindow(hDlg, SW_MINIMIZE);
  108. break;
  109. case ID_CLOSE:
  110. case IDCANCEL:      // press ALT+F4
  111. if(MessageBox(hDlg, "您是否确定退出?", "update", MB_YESNO|MB_DEFBUTTON2)
  112. ==IDNO)
  113. break;
  114. term_app();
  115. if(!f_auto_hangup) run_hangup();
  116. EndDialog(hDlg, 0);
  117. break;
  118. }
  119. break;
  120. case WM_TIMER:
  121. if(f_first)
  122. {
  123. f_first =0;
  124. KillTimer(hDlg, 1);
  125. if(run_dial() <0)              // 自动拨号
  126. {
  127. run_hangup();
  128. log_msg("拨号失败");
  129. }
  130. else ShowWindow(hDlg, SW_MINIMIZE);
  131. SetTimer(hDlg, 1, 10000, NULL);     // 10秒钟检查日期
  132. tcp_init();
  133. /*if(run_app() <0)
  134. {
  135. sprintf(temp, "运行程序 %s 失败", app_name);
  136. ::MessageBox(hDlg, temp, "update", MB_OK);
  137. //EndDialog(hDlg, 0);
  138. break;
  139. }*/
  140. //break;
  141. }
  142. // 检查程序是否退出
  143.     if(hProcess_app && WaitForSingleObject(hProcess_app, 0) ==WAIT_OBJECT_0)
  144. {
  145. log_msg("应用程序已经退出");
  146.     hProcess_app =NULL;
  147. }
  148. if(f_auto_hide)
  149. ShowWindow(hDlg, SW_HIDE);
  150. if(day_is_changed() ==0)
  151. break;  // 晚上24点过了?
  152. if(f_auto_hide)
  153. ShowWindow(hDlg, SW_SHOW);
  154. if(CheckNewFiles(hDlg) <=0)      // 检查是否有新版本
  155. {
  156. if(f_auto_hide) ShowWindow(hDlg, SW_HIDE);
  157. break;
  158. }
  159. if(term_app() <0)           // 中断计费程序
  160. {
  161. sprintf(temp, "term_app %s failed", app_name);
  162. log_msg(temp);
  163. if(f_auto_hide) ShowWindow(hDlg, SW_HIDE);
  164. break;
  165. }
  166. TransNewFiles(hDlg);      // 传输新版本文件
  167. if(run_app() <0)          // 运行计费程序
  168. {
  169. sprintf(temp, "run_app %s failed", app_name);
  170. log_msg(temp);
  171. }
  172. if(f_auto_hide) ShowWindow(hDlg, SW_HIDE);
  173. break;
  174. case WM_QUERYENDSESSION:      // Windows退出
  175. if(!f_auto_hangup) run_hangup();
  176. return TRUE;
  177. }
  178. return FALSE;
  179. }
  180. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPre, LPSTR lpCmdLine, int nCmdShow)
  181. {
  182. char temp[120];
  183. /*if(FindWindow(NULL, "正在检查是否更新系统...")) return 0;*/
  184. GetCurrentDirectory(sizeof(temp), temp);
  185. wsprintf(init_file, "%s\update.ini", temp);
  186. DialogBox(hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc);
  187. tcp_exit();
  188. return 0;
  189. }
  190. // 对SUNOS系统,由于它的ftp server不支持针对文件的SIZE和DATE命令,所以不能正常使用
  191. int CheckNewFiles(HWND hDlg)
  192. {
  193. FILE *fp =NULL;
  194. char temp[256];
  195. int ret =0;
  196. GetPrivateProfileString("update", "version", "1.0", version, sizeof(version), init_file);
  197. GetPrivateProfileString("update", "host", "134.104.69.168", host, sizeof(host), init_file);
  198. GetPrivateProfileString("update", "path", "./", path, sizeof(path), init_file);
  199. SetState("登录主机 ...");
  200. if((sd =ftp_login(host, "caijia", "caijia")) <0)
  201. {
  202. sprintf(temp, "ftp 登录失败: host=%s", host);
  203. if(show_msg) ::MessageBox(hDlg, temp, "update", MB_OK);
  204. else log_msg(temp);
  205. return -1;
  206. }
  207. if(ftp_chdir(sd, path) <0)
  208. {
  209. ftp_quit(sd);
  210. sprintf(temp, "ftp 目录失败: path=%s", path);
  211. if(show_msg) ::MessageBox(hDlg, temp, "update", MB_OK);
  212. else log_msg(temp);
  213. return -1;
  214. }
  215. SetState("读取升级文件 ...");
  216. if(ftp_get_file(sd, P_VERSION_FILE, P_VERSION_FILE, 0, 30) <=0)
  217. {
  218. ftp_quit(sd);
  219. sprintf(temp, "ftp 取升级信息文件失败: host =%s", host);
  220. if(show_msg) ::MessageBox(hDlg, temp, "update", MB_OK);
  221. else log_msg(temp);
  222. return -1;
  223. }
  224. if((fp =fopen(P_VERSION_FILE, "r")) ==NULL)
  225. {
  226. sprintf(temp, "fopen version file for read failed");
  227. if(show_msg) ::MessageBox(hDlg, temp, "update", MB_OK);
  228. else log_msg(temp);
  229. ftp_quit(sd);
  230. return -8;
  231. }
  232. new_file_count =0;
  233. if(fgets(temp, sizeof(temp), fp) ==NULL)
  234. {
  235. sprintf(temp, "read new.ver failed");
  236. if(show_msg) ::MessageBox(hDlg, temp, "ftp_ctl", MB_OK);
  237. else log_msg(temp);
  238. fclose(fp);
  239. ftp_quit(sd);
  240. return -9;
  241. }
  242. app_name[0] =0;
  243. if(sscanf(temp, "%s %s %s %s", new_version, host, path, app_name) <3)
  244. {
  245. fclose(fp);
  246. ftp_quit(sd);
  247. sprintf(temp, "读升级信息文件失败: %s, format error", P_VERSION_FILE);
  248. if(show_msg) ::MessageBox(hDlg, temp, "update", MB_OK);
  249. else log_msg(temp);
  250. return -1;
  251. }
  252. if(strcmp(new_version, version) >0)
  253. {
  254. while(!feof(fp) && fgets(new_file_name[new_file_count], 128, fp))
  255. {
  256. if(new_file_name[new_file_count][0] =='r' || new_file_name[new_file_count][0] =='n') continue;
  257. strtok(new_file_name[new_file_count], "r");
  258. strtok(new_file_name[new_file_count], "n");
  259. new_file_count++;
  260. }
  261. }
  262. fclose(fp);
  263. if(new_file_count ==0)
  264. ftp_quit(sd);
  265. return new_file_count;
  266. }
  267. int TransNewFiles(HWND hDlg)
  268. {
  269. int i, ret =0;
  270. char temp[200];
  271. ShowWindow(hDlg, SW_RESTORE);
  272. SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
  273. for(i =0; i<new_file_count; i++)
  274. {
  275. sprintf(temp, "更新系统:正在取文件 %s...", new_file_name[i]);
  276. SetDlgItemText(hDlg, IDC_MSG, temp);
  277. if(ftp_get_file(sd, new_file_name[i], new_file_name[i], 0, 300) <=0)
  278. {
  279. sprintf(temp, "ftp 取文件失败: file=%s", new_file_name[i]);
  280. if(show_msg) ::MessageBox(hDlg, temp, "update", MB_OK);
  281. else log_msg(temp);
  282. ret =-1;
  283. continue;
  284. }
  285. }
  286. ftp_quit(sd);
  287. if(ret ==0)
  288. {
  289. WritePrivateProfileString("update", "version", new_version, init_file);
  290. WritePrivateProfileString("update", "host", host, init_file);
  291. WritePrivateProfileString("update", "path", path, init_file);
  292. WritePrivateProfileString("update", "app", app_name, init_file);
  293. sprintf(temp, "更新系统成功. 新版本=%s", new_version);
  294. }
  295. else
  296. sprintf(temp, "更新系统失败. 系统需要更新为%s", new_version);
  297. log_msg(temp);
  298. return ret;
  299. }
  300. void log_msg(char *msg)
  301. {
  302. FILE *fp;
  303. time_t t;
  304. struct tm *ptm;
  305. char temp[300];
  306. time(&t);
  307. ptm =localtime(&t);
  308. SetDlgItemText(g_hDlg, IDC_MSG, msg);
  309. if((fp =fopen("update.log", "a")) !=NULL)
  310. {
  311. fprintf(fp, "%02d.%02d %02d.%02d errno:%d, %sn",
  312. ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour,
  313. ptm->tm_min, GetLastError(), msg);
  314. fclose(fp);
  315. if(strlen(msg) >200) *(msg+200) =0;
  316. wsprintf(temp, "%02d.%02d %02d.%02d errno:%d, %srn",
  317. ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour,
  318. ptm->tm_min, GetLastError(), msg);
  319. SendDlgItemMessage(g_hDlg, IDE_MSG, EM_REPLACESEL, 0, (LPARAM)(LPSTR)temp);
  320. }
  321. }
  322. int day_is_changed()
  323. {
  324. time_t t;
  325. struct tm *ptm;
  326. static int cur_day =-1;
  327. char temp[30];
  328. int tt;
  329. time(&t);
  330. if(start_t >0)
  331. {
  332. tt =t-start_t;
  333. wsprintf(temp, "%d:%02d:%02d:", tt/3600, tt%3600/60, tt%60);
  334. SetDlgItemText(g_hDlg, IDC_TIME, temp);
  335. }
  336. ptm =localtime(&t);
  337. if(cur_day ==ptm->tm_mday) return 0;  /* first time is changed */ 
  338. cur_day =ptm->tm_mday;
  339. return 1;
  340. }
  341. int term_app()
  342. {
  343. if(f_auto_hide) WritePrivateProfileString("update", "autohide", "1", init_file);
  344. else  WritePrivateProfileString("update", "autohide", "0", init_file);
  345. if(f_auto_hangup) WritePrivateProfileString("update", "autohangup", "1", init_file);
  346. else  WritePrivateProfileString("update", "autohangup", "0", init_file);
  347. if(hProcess_app ==NULL) return 0;
  348. TerminateProcess(hProcess_app, 1);
  349. CloseHandle(hThread_app);
  350. CloseHandle(hProcess_app);
  351. return 0;
  352. }
  353. int run_app()
  354. {
  355. STARTUPINFO si;
  356. PROCESS_INFORMATION pi;
  357. char temp[100];
  358. if(app_name[0] ==0) return 0;
  359. memset(&si, 0, sizeof(si));
  360. if(CreateProcess(app_name, app_name, NULL, NULL, false, 0, NULL, NULL, &si, &pi) ==0)
  361. {
  362. sprintf(temp, "CreateProcess failed! errno:%d", GetLastError());
  363. log_msg(temp);
  364. return -1;
  365. }
  366. hThread_app =pi.hThread;
  367. hProcess_app =pi.hProcess;
  368. return 0;
  369. }
  370. int run_dial()
  371. {
  372. // rundll rnaui.dll,RnaDial ???
  373. char dial_name[100], dial_user[50], dial_pass[20], temp[200], err_buf[100];
  374. RASDIALPARAMS rdParams;
  375. DWORD dwRet;
  376. BOOL f_get_password;
  377.  
  378. if(GetPrivateProfileString("update", "dialname", NULL, dial_name,
  379. sizeof(dial_name), init_file) ==0) return 0;
  380. dial_user[0] =dial_pass[0] =0;
  381. GetPrivateProfileString("update", "dialuser", NULL, dial_user,
  382. sizeof(dial_user), init_file);
  383. GetPrivateProfileString("update", "dialpass", NULL, dial_pass,
  384. sizeof(dial_pass), init_file);
  385. memset(&rdParams, 0, sizeof(rdParams));
  386. rdParams.dwSize=sizeof(RASDIALPARAMS);
  387. strcpy(rdParams.szEntryName,dial_name);
  388. //strcpy(rdParams.szPhoneNumber,"169");
  389. //strcpy(rdParams.szCallbackNumber,"*");
  390. if(dial_user[0] ==0 || dial_pass[0] ==0)
  391. {
  392. if(RasGetEntryDialParams(NULL, &rdParams, &f_get_password) !=0)
  393. {
  394. wsprintf(temp, "读取拨号网络%s的用户名和密码失败", dial_name);
  395. log_msg(temp);
  396. return -1;
  397. }
  398. if(f_get_password ==false)
  399. {
  400. wsprintf(temp, "读取拨号网络%s的密码失败,请先使用保存密码成功拨号一次", dial_name);
  401. log_msg(temp);
  402. return -1;
  403. }
  404. }
  405. else
  406. {
  407. strcpy(rdParams.szUserName, dial_user);
  408. strcpy(rdParams.szPassword, dial_pass);
  409. }
  410. //strcpy(rdParams.szDomain,"*");
  411. g_hRasConn=NULL;
  412. //if((dwRet=RasDial(NULL,NULL,&rdParams,0L, (RASDIALFUNC)RasDialFunc,&g_hRasConn)) !=0)
  413. wsprintf(temp, "正在拨号... name=%s", dial_name);
  414. log_msg(temp);
  415. if((dwRet=RasDial(NULL,NULL,&rdParams,0L, NULL, &g_hRasConn)) !=0)
  416. {
  417. RasGetErrorString(dwRet, err_buf, sizeof(err_buf));
  418. wsprintf(temp, "拨号失败, name=%s, ret=%d:%s", dial_name, dwRet, err_buf);
  419. log_msg(temp);
  420. return -1;
  421. }
  422. time(&start_t);   // 开始计时
  423. wsprintf(temp, "拨号成功, name=%s", dial_name);
  424. log_msg(temp);
  425. return 0;
  426. }
  427. void run_hangup()
  428. {
  429. if(g_hRasConn) RasHangUp(g_hRasConn);
  430. g_hRasConn =NULL;
  431. }
  432. void WINAPI RasDialFunc(UINT msg, RASCONNSTATE state, DWORD dwError)
  433. {
  434. switch(state)
  435. {
  436. case RASCS_Connected:
  437. g_fconnected =true;
  438. break;
  439. case RASCS_Disconnected:
  440. g_fconnected =false;
  441. break;
  442. }
  443. }
  444. void SetState(char *msg)
  445. {
  446. SetDlgItemText(g_hDlg, IDC_MSG, msg);
  447. }