欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

libevent庫的使用--定時器的使用實例

 更新時間:2013年12月21日 15:29:09   作者:  
這篇文章主要介紹了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())。在裝載最初的文件時和在計時器觸發(fā)回調時都使用此函數(shù)。
read_file() 函數(shù)使用 stat() 函數(shù)調用檢查文件的修改時間,只有在上一次裝載之后修改了文件的情況下,它才重新讀取文件的內容。此函數(shù)通過調用 fread() 裝載文件數(shù)據,把數(shù)據復制到另一個結構中,然后使用 strcpy() 把數(shù)據從裝載的字符串轉移到全局字符串中。
load_file() 函數(shù)是觸發(fā)計時器時調用的函數(shù)。它通過調用 read_file() 裝載內容,然后使用 RELOAD_TIMEOUT 值設置計時器,作為嘗試裝載文件之前的秒數(shù)。libevent 計時器使用 timeval 結構,允許按秒和毫秒指定計時器。計時器不是周期性的;當觸發(fā)計時器事件時設置它,然后從事件隊列中刪除事件。
使用與前面的示例相同的格式編譯代碼:$ gcc -o basichttpfile basichttpfile.c -levent。
現(xiàn)在,創(chuàng)建作為數(shù)據使用的靜態(tài)文件;默認文件是 sample.html,但是可以通過命令行上的第一個參數(shù)指定任何文件(見 清單 6)。
清單 6. 創(chuàng)建作為數(shù)據使用的靜態(tài)文件

復制代碼 代碼如下:

$ ./basichttpfile
Loading file: sample.html (8046 bytes)
Server started on port 8081

現(xiàn)在,程序可以接受請求了,重新裝載計時器也啟動了。如果修改 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)

注意,要想獲得最大的收益,必須確保環(huán)境沒有限制打開的文件描述符數(shù)量??梢允褂?ulimit 命令修改限制(需要適當?shù)臋嘞藁蚋L問)。具體的設置取決與您的 OS,但是在 Linux® 上可以用 -n 選項設置打開的文件描述符(和網絡套接字)的數(shù)量

相關文章

  • CFileDialog的鉤子函數(shù)解決對話框的多選之DoModal問題

    CFileDialog的鉤子函數(shù)解決對話框的多選之DoModal問題

    前幾天領導問我一個問題:就是使用CFileDialog類在設置多選時選中的文件所放的文件緩沖區(qū)不知設置多大合適,本文將詳細介紹,需要的朋友可以參考下
    2012-12-12
  • C語言中6組指針和自增運算符結合方式的運算順序問題

    C語言中6組指針和自增運算符結合方式的運算順序問題

    本文通過代碼實現(xiàn)分析了6種組合:* p++,(* p)++,* (p++),++* p,++( * p), * (++p),需要的朋友可以參考下
    2015-07-07
  • C++實現(xiàn)PyMysql的基本功能實例詳解

    C++實現(xiàn)PyMysql的基本功能實例詳解

    這篇文章主要介紹了C++實現(xiàn)PyMysql的基本功能,本文通過實例代碼給大家介紹的非常詳細,對大家的工作或學習有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C語言實現(xiàn)翻譯功能

    C語言實現(xiàn)翻譯功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的翻譯功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++17使用std::optional表示可能存在的值

    C++17使用std::optional表示可能存在的值

    本文主要介紹了C++17使用std::optional表示可能存在的值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 深入了解C++中常用的三個智能指針

    深入了解C++中常用的三個智能指針

    C++是一門強大的編程語言,但是在內存管理方面卻存在著一些問題。手動管理內存不僅費時費力,而且容易出錯。因此,C++中引入了智能指針這一概念,以更好地管理內存,下面就來詳細講講C++中常用的三個智能指針吧
    2023-05-05
  • C++?Cartographer源碼中關于傳感器的數(shù)據傳遞實現(xiàn)

    C++?Cartographer源碼中關于傳感器的數(shù)據傳遞實現(xiàn)

    這篇文章主要介紹了C++?Cartographer源碼中關于傳感器的數(shù)據傳遞實現(xiàn),前面已經談到了Cartographer中添加軌跡的方法和傳感器的數(shù)據流動走向。發(fā)現(xiàn)在此調用了LaunchSubscribers這個函數(shù)來訂閱相關傳感器數(shù)據
    2023-03-03
  • C++設計模式之工廠模式

    C++設計模式之工廠模式

    本文是C++設計模式系列文章的第一篇,主要給大家講述下工廠模式,非常的簡單實用,有需要的小伙伴可以參考下
    2016-05-05
  • 詳解C++中typedef 和 #define 的區(qū)別

    詳解C++中typedef 和 #define 的區(qū)別

    這篇文章主要介紹了C++中typedef 與 #define 的區(qū)別,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++超詳細講解數(shù)組操作符的重載

    C++超詳細講解數(shù)組操作符的重載

    C 語言提供了豐富的操作符,有:算術操作符,移位操作符,位操作符,賦值操作符,單目操作符,關系操作符,邏輯操作符,條件操作符等。接下了讓我們探究一下數(shù)組操作符的重載
    2022-06-06

最新評論