用c语言实现后台运行的、每隔30s检查一次的、带有日志功能的断网重新连接程序

 

 

// 参考链接

// C\C++控制台程序隐藏方法总结  https://blog.csdn.net/lynch0571/article/details/33320551
// 取消提醒《 Win10你要允许此应用对你的电脑进行更改吗 》 http://www.w10zj.com/Win10xy/Win10yh_1623.html
/*
这是一个后台运行的、每隔60s检查一次的、带有日志功能的断网重新连接程序。
早上0到6点,不执行断网重连和写日志功能,只有连续6次ping测试都失败了才会启动联网程序
要想使用它必须要配置好c语言环境,比如安装有mingw的codeblocks,vs不能后台运行,只能在codeblocks中实现后台
实现的方式就是每隔一段时间就去ping一下百度,如果ping失败了就启动上网程序,上网程序会自动连接网络。
使用时将该软件加入开机自启软件即可
*/
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 加上后可以后台运行
#include<windows.h>
#include <iostream>
#include <cstdlib>

#include <stdio.h>
#include <ctime>

#include <stdlib.h>
#include <string.h>
#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>        // linux下头文件
#endif

#include<ctime>
#define FILE_MAX_SIZE (1024*1024)// 日志文件最大为1M

using namespace std;

/*
获得当前时间字符串
@param buffer [out]: 时间字符串
@return 空
*/
void get_local_time(char* buffer)
{
    time_t rawtime;
    struct tm* timeinfo;

    time(&rawtime);
    timeinfo = localtime(&rawtime);
    sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d",
        (timeinfo->tm_year + 1900), timeinfo->tm_mon + 1, timeinfo->tm_mday,
        timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
}

/*
获得日志文件大小
@param filename [in]: 文件名
@return 文件大小
*/
long get_file_size(char* filename)
{
    long length = 0;
    FILE *fp = NULL;

    fp = fopen(filename, "rb");
    if (fp != NULL)
    {
        fseek(fp, 0, SEEK_END);
        length = ftell(fp);
    }

    if (fp != NULL)
    {
        fclose(fp);
        fp = NULL;
    }

    return length;
}

/*
写入日志文件
@param filename [in]: 日志文件名
@param max_size [in]: 日志文件大小限制
@param buffer [in]: 日志内容
@param buf_size [in]: 日志内容大小
@return 空
*/
void write_log_file(char* filename, long max_size, char* buffer, unsigned buf_size)
{
    if (filename != NULL && buffer != NULL)
    {
        // 文件超过最大限制, 删除
        long length = get_file_size(filename);

        if (length > max_size)
        {
            unlink(filename); // 删除文件
        }

        // 写日志
        {
            FILE *fp;
            fp = fopen(filename, "at+");
            if (fp != NULL)
            {
                char now[32];
                memset(now, 0, sizeof(now));
                get_local_time(now);
                fwrite(now, strlen(now) + 1, 1, fp);
                fwrite(buffer, buf_size, 1, fp);

                fclose(fp);
                fp = NULL;
            }
        }
    }
}

/*
后台运行的、每隔60s检查一次的、带有日志功能的断网重新连接程序
*/
void p()
{
    // 隐藏窗口
    HWND hwnd;
    hwnd = FindWindow("ConsoleWindowClass", NULL);    //处理顶级窗口的类名和窗口名称匹配指定的字符串,不搜索子窗口。
    if (hwnd)
    {
        ShowWindow(hwnd, SW_HIDE);                //设置指定窗口的显示状态
    }

    while (1)
    {
        // 睡眠60s
        _sleep(60000);

        // 早上0到6点,不执行断网重连和写日志功能
        // now为1970 到目前经过秒数,ltm->tm_hour为现在的小时数
        time_t now = time(0);
        tm *ltm = localtime(&now);
        if (ltm->tm_hour > 6)
        {
            int count = 0;// ping失败的次数
            for (int i = 0; i < 6; i++)
            {
                // 写入日志文件
                char buffer[32];
                memset(buffer, 0, sizeof(buffer));

                // 断网重连
                clock_t start, end;// 计时
                start = clock();
                system("ping 8.8.8.8 -w 3500");// system执行cmd命令, 可以用cout打印返回结果
                end = clock();
                double duration = ((double)end - start) / CLOCKS_PER_SEC;
                if (duration > 10.0)
                {
                    count += 1;
                    sprintf(buffer, "====> %s%d%s\n", "", i, "次ping失败#############");
                }
                else
                {
                    sprintf(buffer, "====> %s%d%s\n", "", i, "次ping成功");
                }
                char s[] = "log.txt";
                write_log_file(s, FILE_MAX_SIZE, buffer, strlen(buffer));
            }


            if(count == 6)
                system("start /b C:\\\"Program Files\"\\\"Ruijie Networks\"\\\"Ruijie Supplicant\"\\RuijieSupplicant.exe");// 路径用\\,双引号为转义字符,前面要加\


            // 写入日志文件
            char buffer[32];
            memset(buffer, 0, sizeof(buffer));
            if (count < 6)
                sprintf(buffer, "====> %s%d%s\n", "6次ping测试成功了", 6 - count, "次,有网");
            else
                sprintf(buffer, "====> %s\n", "6次ping测试全部都没有ping通过,没有网#######################################################################################################");
            char s[] = "log.txt";
            write_log_file(s, FILE_MAX_SIZE, buffer, strlen(buffer));
        }
    }
}

/*
计时函数,没有用到
*/
void g()
{
    clock_t start, end;
    start = clock();
    _sleep(1234);
    end = clock();
    double duration = ((double)end - start) / CLOCKS_PER_SEC;
    printf("%f second", duration);
}
/*
获取小时函数,这里只是测试,没用到
*/
void time()
{
    // now为1970 到目前经过秒数,ltm->tm_hour为现在的小时数
    time_t now = time(0);
    tm *ltm = localtime(&now);
    cout << ltm->tm_hour << "蒋凯楠";
}
int main()
{
    p();
    return 0;
}

 

posted on 2018-09-17 18:08  jkn1234  阅读(1065)  评论(0编辑  收藏  举报