找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4785|回复: 3

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

[复制链接]
发表于 2006-1-20 15:40:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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

  3. void start_bt(int ii)
  4.                 {
  5.                         if (ii == 1)
  6.                         {
  7.                         system("/etc/start.sh");
  8.                         }
  9.                 else
  10.                 ;
  11.                 }
  12.                
  13. void stop_bt(int ii)
  14.                 {
  15.                         if (ii == 0)
  16.                         {
  17.                         system("/etc/stop.sh");
  18.                         }
  19.                 else
  20.                 ;
  21.                 }


  22. main()
  23. {

  24. time_t timep;
  25. struct tm *p;
  26. time(&timep);
  27. int start,stop,i;
  28. start = 23;
  29. stop  = 7;
  30. p=localtime(&timep);
  31. if (p->tm_hour tm_hour >= start)
  32.                 i = 1;
  33.         else
  34.                 i = 0;

  35. while(1)
  36.                 {
  37.                 time(&timep);
  38.                 p=localtime(&timep); /*取得当地时间*/
  39.                 if (p->tm_hour tm_hour >= start)
  40.                 {
  41.                         start_bt(i);
  42.                         i=0;
  43.                 }
  44.                 else
  45.                 {
  46.                         stop_bt(i);
  47.                         i=1;
  48.                         }
  49.                 sleep(60);
  50.                 }
  51. }
复制代码


原理:在给定的时间范围内调用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,有很多不明白,请大家莫笑。
routeros
发表于 2006-1-21 13:09:49 | 显示全部楼层
怎么不用cron做?那要简单得多了。
是不是太美在练习C编程?
routeros
回复

使用道具 举报

发表于 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下是否也一样
routeros
回复

使用道具 举报

发表于 2006-1-23 17:54:17 | 显示全部楼层
做笔记中。。。。
routeros
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )

GMT+8, 2024-10-5 09:53 , Processed in 0.082892 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表