/****************************************************************** * Copyright (c) 2005-2008 CUG-CS * All rights reserved * * 文件名称:eMuleShutDown.c * 简要描述:实现电驴下载完成后自动关机 * * 当前版本:2.0 * 修 改 者:raincatss * 完成日期:2008-03-20 * 修订说明:添加了下载速度低于指定值时关机的功能; * 重写了大部分代码,使代码结构更加清晰。 * * 取代版本:1.1 * 作 者:raincatss * 完成日期:2007-12-01 * * 开发环境:Windows XP Sp2 + gcc version 3.4.2 (mingw-special) * 个人博客:http://raincatss.cublog.cn/ ******************************************************************/
#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h>
#include <io.h> #include <direct.h> #include <windows.h>
#define ONE_SEC 1000 #define TIME_OUT 8 #define TIME_SLEEP (5 * 60 * ONE_SEC)
#define BUFFSIZE 512
static int shutDownMode; static int minSpeed;
void logo(void); void init(void); int taskDone(void); int speedLow(void); int getReceived(void); void shutDown(void);
int main(void) { logo(); init(); while (1) { if ((shutDownMode == 1 && taskDone()) / || (shutDownMode == 2 && speedLow())) { shutDown(); } Sleep(TIME_SLEEP); } return 0; }
void logo(void) { printf(" ------欢迎使用电驴关机管理系统------/n"); printf("/n"); printf(" 作者: raincatss/n"); printf(" 博客:raincatss.cublog.cn/n"); printf(" 邮箱: raincatss@gmail.com/n"); printf("/n"); printf(" 祝君好运^_^/n"); printf("/n"); }
void init(void) { int ch; int choice; int waiting; int ret; char buf[BUFFSIZE]; printf("请选择关机模式:/n"); printf("/n"); printf(" 1 任务全部完成后关机(默认)/n"); printf(" 2 下载速度低于一定值时关机/n"); printf("/n"); choice = '1'; waiting = 0; printf("剩余时间:"); while (!kbhit() || (ch = getch()) < '1' || ch > '2') { fflush(stdin); printf("%d/b", TIME_OUT - waiting); Sleep(ONE_SEC); ++waiting; if (waiting >= TIME_OUT) { break; } } if (waiting < TIME_OUT) { choice = ch; } shutDownMode = choice - '0'; printf("/r关机模式:%d/n", shutDownMode); printf("/n"); if (shutDownMode == 1) { return; } /* 以下处理关机模式2 */ printf("请选择下载速度最低值:/n"); printf("/n"); printf(" 1 10kb/s(默认) 2 20kb/s/n"); printf(" 3 30kb/s 4 其它/n"); printf("/n"); choice = '1'; waiting = 0; printf("剩余时间:"); while (!kbhit() || (ch = getch()) < '1' || ch > '4') { fflush(stdin); printf("%d/b", TIME_OUT - waiting); Sleep(ONE_SEC); ++waiting; if (waiting >= TIME_OUT) { break; } } if (waiting < TIME_OUT) { choice = ch; } if (choice == '4') { printf("/r请输入最低值:"); ret = minSpeed = 0; fgets(buf, sizeof(buf), stdin); ret = sscanf(buf, "%d", &minSpeed); while (ret != 1 || minSpeed < 0) { printf("输入错误,请重新输入!/n"); printf("/n"); printf("请输入最低值:"); fgets(buf, sizeof(buf), stdin); ret = sscanf(buf, "%d", &minSpeed); } } else { minSpeed = (choice - '0') * 10; } printf("/r最低值:%dkb/s/n", minSpeed); printf("/n"); }
int taskDone(void) { int done; long handle; int numOfTask; struct _finddata_t fd; static char *ext = "*.part"; static char *DIR = "C://Program Files//eMule//Temp"; /* Temp文件夹路径 */
chdir(DIR); /* 切换当前目录为DIR */ numOfTask = 0; handle = _findfirst(ext, &fd); if (handle != -1) { /* 找到文件,下载未完成 */ do { done = _findnext(handle, &fd); ++numOfTask; } while (done == 0); _findclose(handle);
printf("还有%d个任务未完成.../n/n", numOfTask); } else { /* 未找到,下载已完成 */ _findclose(handle); printf("所有任务已完成/n"); } return !numOfTask; }
int speedLow(void) { const float RATIO = 0.8; static int oldReceived = -1; int received; int speed; if (oldReceived == -1) { oldReceived = getReceived(); return 0; } else { received = getReceived(); speed = ((received - oldReceived) * RATIO) / (1024 * 60 * 5); if (speed < minSpeed) { printf("下载速度低于%dkb/s/n", minSpeed); return 1; } else { oldReceived = received; return 0; } } }
int getReceived(void) { int received; char *tmp = "$$TMP_RECEIVED$$"; char cmd[BUFFSIZE]; char *buf; FILE *fp; strcpy(cmd, "netstat -e | find /"Bytes/" > "); strcat(cmd, tmp); system(cmd); fp = fopen(tmp, "r"); if (NULL == fp) { fprintf(stderr, "Error: cannot open tmp file!/n"); exit(1); } buf = cmd; fgets(buf, BUFFSIZE, fp); sscanf(buf, "%*s%d", &received); fclose(fp); remove(tmp); return received; }
void shutDown(void) { printf("系统将在60秒后关机.../n/n"); /* 关闭电驴,或用语句 system("ntsd -c q -pn eMule.exe"); 关闭*/ system("taskkill /f /im eMule.exe"); system("shutdown -s -f -t 60"); /* 60秒后关机 */ printf("按任意键取消关机.../n"); while (!kbhit()) { /* 循环直到按键动作发生 */ Sleep(ONE_SEC); } system("shutdown -a"); /* 取消关机 */ printf("关机已取消.../n/n"); system("pause"); exit(0); }
|