程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> libevent庫的應用--准時器的應用實例

libevent庫的應用--准時器的應用實例

編輯:關於C++

libevent庫的應用--准時器的應用實例。本站提示廣大學習愛好者:(libevent庫的應用--准時器的應用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是libevent庫的應用--准時器的應用實例正文



#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <event.h>
#include <evhttp.h>

#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 構造,許可按秒和毫秒指定計時器。計時器不是周期性的;當觸發計時器事宜時設置它,然後從事宜隊列中刪除事宜。
應用與後面的示例雷同的格局編譯代碼:$ 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 選項設置翻開的文件描寫符(和收集套接字)的數目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved