<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術平等自由協作創造

    Java專題文章博客和開源

    常用鏈接

    統計

    最新評論

    libevent庫定時器的使用

      libevent庫定時器的使用

      #include

      #include

      #include

      #include

      #include

      #include

      #include

      #include

      #define RELOAD_TIMEOUT 5

      #define DEFAULT_FILE "sample.html"

      char *filedata;

      time_t lasttime = 0;

      char filename[80];

      int counter = 0;

      void read_file()

      {

      int size = 0;

      char *data;

      struct stat buf;

      stat(filename,&buf);

      if (buf.st_mtime > lasttime)

      {

      if (counter++)

      fprintf(stderr,"Reloading file: %s",filename);

      else

      fprintf(stderr,"Loading file: %s",filename);

      FILE *f = fopen(filename, "rb");

      if (f == NULL)

      {

      fprintf(stderr,"Couldn't open file\n");

      exit(1);

      }

      fseek(f, 0, SEEK_END);

      size = ftell(f);

      fseek(f, 0, SEEK_SET);

      data = (char *)malloc(size+1);

      fread(data, sizeof(char), size, f);

      filedata = (char *)malloc(size+1);

      strcpy(filedata,data);

      fclose(f);

      fprintf(stderr," (%d bytes)\n",size);

      lasttime = buf.st_mtime;

      }

      }

      void load_file()

      {

      struct event *loadfile_event;

      struct timeval tv;

      read_file();

      tv.tv_sec = RELOAD_TIMEOUT;

      tv.tv_usec = 0;

      loadfile_event = malloc(sizeof(struct event));

      evtimer_set(loadfile_event,

      load_file,

      loadfile_event);

      evtimer_add(loadfile_event,

      &tv);

      }

      void generic_request_handler(struct evhttp_request *req, void *arg)

      {

      struct evbuffer *evb = evbuffer_new();

      evbuffer_add_printf(evb, "%s",filedata);

      evhttp_send_reply(req, HTTP_OK, "Client", evb);

      evbuffer_free(evb);

      }

      int main(int argc, char *argv[])

      {

      short http_port = 8081;

      char *http_addr = "192.168.0.22";

      struct evhttp *http_server = NULL;

      if (argc > 1)

      {

      strcpy(filename,argv[1]);

      printf("Using %s\n",filename);

      }

      else

      {

      strcpy(filename,DEFAULT_FILE);

      }

      event_init();

      load_file();

      http_server = evhttp_start(http_addr, http_port);

      evhttp_set_gencb(http_server, generic_request_handler, NULL);

      fprintf(stderr, "Server started on port %d\n", http_port);

      event_dispatch();

      }

      這個服務器的基本原理與前面的示例相同。首先,腳本設置一個 HTTP 服務器,它只響應對基本 URL 主機/端口組合的請求(不處理請求 URI)。第一步是裝載文件 (read_file())。在裝載最初的文件時和在計時器觸發回調時都使用此函數。

      read_file() 函數使用 stat() 函數調用檢查文件的修改時間,只有在上一次裝載之后修改了文件的情況下,它才重新讀取文件的內容。此函數通過調用 fread() 裝載文件數據,把數據復制到另一個結構中,然后使用 strcpy() 把數據從裝載的字符串轉移到全局字符串中。

      load_file() 函數是觸發計時器時調用的函數。它通過調用 read_file() 裝載內容,然后使用 RELOAD_TIMEOUT 值設置計時器,作為嘗試裝載文件之前的秒數。libevent 計時器使用 timeval 結構,允許按秒和毫秒指定計時器。計時器不是周期性的;當觸發計時器事件時設置它,然后從事件隊列中刪除事件。sat答案

      使用與前面的示例相同的格式編譯代碼:$ gcc -o basichttpfile basichttpfile.c -levent。

      現在,創建作為數據使用的靜態文件;默認文件是 sample.html,但是可以通過命令行上的第一個參數指定任何文件(見 清單 6)。

      清單 6. 創建作為數據使用的靜態文件

      $ ./basichttpfile

      Loading file: sample.html (8046 bytes)

      Server started on port 8081

      現在,程序可以接受請求了,重新裝載計時器也啟動了。如果修改 sample.html 的內容,應該會重新裝載此文件并在日志中記錄一個消息。例如,清單 7 中的輸出顯示初始裝載和兩次重新裝載:

      清單 7. 輸出顯示初始裝載和兩次重新裝載

      $ ./basichttpfile

      Loading file: sample.html (8046 bytes)

      Server started on port 8081

      Reloading file: sample.html (8047 bytes)

      Reloading file: sample.html (8048 bytes)

      注意,要想獲得最大的收益,必須確保環境沒有限制打開的文件描述符數量。可以使用 ulimit 命令修改限制(需要適當的權限或根訪問)。具體的設置取決與您的 OS,但是在 Linux? 上可以用 -n 選項設置打開的文件描述符(和網絡套接字)的數量:托福答案
     

    posted on 2014-01-03 23:11 好不容易 閱讀(296) 評論(1)  編輯  收藏

    評論

    # re: libevent庫定時器的使用 2014-01-10 14:59 笑面虎

    huigongzuo.com丨51fsk.com | peixunt.com | luwuyou.com
      回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 日韩在线视频免费| 九九九精品视频免费| 国产亚洲AV手机在线观看| 亚洲精品无码永久在线观看你懂的| 亚洲AV无码乱码国产麻豆 | 久久亚洲国产午夜精品理论片| 亚洲精品成人a在线观看| 好看的亚洲黄色经典| 亚洲精品欧洲精品| 亚洲国产成人精品无码区二本| 亚洲欧美黑人猛交群| 亚洲熟女综合一区二区三区| 无忧传媒视频免费观看入口| 玖玖在线免费视频| 久久久久久国产精品免费免费男同 | 亚洲国产成人久久综合区| 亚洲熟妇丰满多毛XXXX| 亚洲无人区视频大全| 亚洲国产激情在线一区| 日本一区二区在线免费观看| 久久精品国产影库免费看| 女人18毛片特级一级免费视频 | 亚洲va无码专区国产乱码| 亚洲AV无码一区二区三区在线 | 韩国免费A级毛片久久| 亚洲国产精品免费观看| 在线jlzzjlzz免费播放| 亚洲宅男天堂在线观看无病毒| 亚洲免费中文字幕| v片免费在线观看| 最近免费中文字幕视频高清在线看| 免费无码看av的网站| 亚洲爆乳无码一区二区三区| 亚洲人成电影网站色www| 日本高清免费观看| 国产在线19禁免费观看| 区久久AAA片69亚洲| 亚洲熟妇无码一区二区三区| a级成人毛片免费视频高清| 蜜臀AV免费一区二区三区| 啦啦啦手机完整免费高清观看|