心想事成 发表于 2006-1-20 15:40:48

分享一段进行时间控制的C程序

单位用coyote做路由上网,可是在上班时间老是有很多人疯狂地用bt、迅雷、emule下载,严重影响了正常的工作。本来有iptables的time模块的,可是我试了下,time模块居然不支持在POSTROUTING链中作限制。所以花了点儿时间,写了段c程序,用以控制使用p2p的时间。这段程序的作用就是设置早7点至晚23点禁止p2p下载,其余时间则则允许。本程序只能精确到小时,期待有人改进下,可以精确到分钟。这段程序可以在任何linux机器上编译通过,编译命令为:
gcc time.c -o timeset
time.c的源码如下:
#include ;
#include ;

void start_bt(int ii)
                {
                        if (ii == 1)
                        {
                        system("/etc/start.sh");
                        }
                else
                ;
                }
               
void stop_bt(int ii)
                {
                        if (ii == 0)
                        {
                        system("/etc/stop.sh");
                        }
                else
                ;
                }


main()
{

time_t timep;
struct tm *p;
time(&timep);
int start,stop,i;
start = 23;
stop= 7;
p=localtime(&timep);
if (p->tm_hour tm_hour >= start)
                i = 1;
        else
                i = 0;

while(1)
                {
                time(&timep);
                p=localtime(&timep); /*取得当地时间*/
                if (p->tm_hour tm_hour >= start)
                {
                        start_bt(i);
                        i=0;
                }
                else
                {
                        stop_bt(i);
                        i=1;
                        }
                sleep(60);
                }
}

原理:在给定的时间范围内调用shell脚本,两个脚本在/etc目录中,内容如下
stop.sh
#!/bin/sh
iptables -t mangle -A POSTROUTING -m layer7 --l7proto bittorrent -j DROP
iptables -t mangle -A POSTROUTING -m layer7 --l7proto xunlei -j DROP
iptables -t mangle -A POSTROUTING -m layer7 --l7proto edonkey -j DROP
iptables -t mangle -A POSTROUTING -m layer7 --l7proto bitcomet -j DROP

start.sh
#!/bin/sh
iptables -t mangle -D POSTROUTING -m layer7 --l7proto bittorrent -j DROP
iptables -t mangle -D POSTROUTING -m layer7 --l7proto xunlei -j DROP
iptables -t mangle -D POSTROUTING -m layer7 --l7proto edonkey -j DROP
iptables -t mangle -D POSTROUTING -m layer7 --l7proto bitcomet -j DROP

使用方法:
直接运行编译出来的timeset程序,命令行:
timeset &
本来应当它把做成守护进程运行的,但因初学C,有很多不明白,请大家莫笑。

lengbingqing 发表于 2006-1-21 13:09:49

怎么不用cron做?那要简单得多了。
是不是太美在练习C编程?

zhangweizj 发表于 2006-1-23 10:40:38

SYSTEMTIME sys;
GetLocalTime(&sys);

以下是SYSTEMTIME的结构
typedef struct_SYSTEMTIME
    {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
    }SYSTEMTIME;

这个是Win32下的,不知道Linux下是否也一样

samhui 发表于 2006-1-23 17:54:17

做笔记中。。。。
页: [1]
查看完整版本: 分享一段进行时间控制的C程序