<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 好不容易 閱讀(295) 評論(1)  編輯  收藏

    評論

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

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


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


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 亚洲精品免费在线| 99在线在线视频免费视频观看| 美女视频黄的全免费视频网站| 久久亚洲AV成人无码| 99久久人妻精品免费一区| 亚洲国产精品人久久| 99在线在线视频免费视频观看| 亚洲精品白色在线发布| 18禁止看的免费污网站| 亚洲一区无码中文字幕乱码| 免费精品国产日韩热久久| 亚洲综合成人婷婷五月网址| 色播在线永久免费视频| 在线观看亚洲免费视频| 国产精品亚洲综合一区| 99re8这里有精品热视频免费| 久久亚洲AV午夜福利精品一区| 性xxxxx大片免费视频| 亚洲天堂一区二区三区| 韩国欧洲一级毛片免费| 免费无码一区二区| 亚洲日韩精品无码一区二区三区 | 亚洲国产精品成人AV在线| 精品国产麻豆免费网站| xxxxx做受大片视频免费| 久久精品亚洲一区二区| 久久精品免费一区二区| 亚洲妇女无套内射精| www.亚洲色图.com| 一个人免费视频在线观看www| 久久久久亚洲av无码尤物| 国产91色综合久久免费| 亚洲精品永久在线观看| 亚洲综合精品香蕉久久网| av大片在线无码免费| 亚洲AV无码AV日韩AV网站| 日本亚洲欧洲免费天堂午夜看片女人员| 2021在线观看视频精品免费| 亚洲.国产.欧美一区二区三区| 亚洲日韩欧洲乱码AV夜夜摸| 大地资源二在线观看免费高清|