<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開獎
    主站蜘蛛池模板: 亚洲精品亚洲人成在线播放| 免费一看一级毛片人| 96免费精品视频在线观看| 两性色午夜视频免费网| 久久久受www免费人成| 成人A毛片免费观看网站| 成全视成人免费观看在线看| 二级毛片免费观看全程| caoporn国产精品免费| 99精品视频免费| 久久综合给合久久国产免费| 香港a毛片免费观看| 中文字幕免费观看| 日本在线高清免费爱做网站| 成年在线观看网站免费| 成人永久免费福利视频网站| 免费一看一级毛片人| 中文字幕精品亚洲无线码一区| 国产AV无码专区亚洲精品| 91精品国产亚洲爽啪在线观看| 亚洲mv国产精品mv日本mv| 亚洲精品无码久久久久YW| 青青草97国产精品免费观看| aa级毛片毛片免费观看久| 8888四色奇米在线观看免费看| 99在线视频免费观看视频 | 久久亚洲精品国产亚洲老地址| 中文字幕亚洲综合小综合在线| 亚洲国产av玩弄放荡人妇| 色屁屁在线观看视频免费| 韩国免费a级作爱片无码| 99久热只有精品视频免费看| 99久久免费国产精品特黄| 亚洲成a人一区二区三区| 久久精品国产精品亚洲艾| 亚洲一区二区三区91| 免费精品国产自产拍在线观看| a级毛片免费全部播放无码| 久久久久久国产a免费观看黄色大片 | 激情亚洲一区国产精品| 青青免费在线视频|