91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Libmicrohttpd搭建內嵌(本地)服務器的方法

發布時間:2020-10-06 14:53:08 來源:腳本之家 閱讀:321 作者:jingxian 欄目:編程語言

Libmicrohttpd簡介

GNU Libmicrohttpd是一個用來在項目中內嵌http服務器的C語言庫,它具有以下幾個非常鮮明的特點:

C語言庫,小而快。

API非常簡單,且都是可重入的。

兼容HTTP1.1。

支持4種多線程模型(select、poll、pthread、thread poll)。

跨平臺。

生成的二制文件只有32K(不包含TLS/SSL等額外功能)。

搭建一個簡單的本地靜態服務器

這篇文章里,我們只編寫一個簡單的靜態服務器,對于用戶的所有請求我們都只返回同一個html頁面, 該頁面顯示一串字符。

1. 下載Libmicrohttpd,編譯后添加進VS項目

為了使用Libmicrohttpd,我們需要將其添加進VS項目中。這里我們選擇編譯源代碼生成靜態庫,因為官方給的下載靜態庫版本鏈接在使用時會有問題,可能是運行庫版本不一致; 并且在使用靜態庫的情況下,我們只需要引用兩個文件就可以了(一個頭文件、一個庫文件),項目結構不會混亂不清。

實際上Libmicrohttpd的源碼編譯非常簡單,它提供了VS編譯文件,基本上我們只需要進入<>w32目錄,在該目錄下選擇合適的VS子目錄下的sln文件,雙擊打開就可以了。打開后,修改設置libmicrohttpd項目為靜態庫項目(記得修改生成文件的后綴名,因為默認是dll),右擊生成就可以編譯成功了。

生成的文件包括一個頭文件和一個靜態庫文件,新建一個VS控制臺項目,并將它們添加到VS項目中。

2. main函數

main函數非常簡單,核心調用只有2個函數:<>MHD_start_daemonMHD_stop_daemon,分別開始和停止http服務器。

int main()
{
  const int port = 8888;

  struct MHD_Daemon* daemon = 
    MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, port
    , NULL, NULL, connectionHandler, NULL, MHD_OPTION_END);
  if (daemon == NULL) {
    std::cout << "cannot start server!\n";
    return -1;
  }

  std::cin.get();
  MHD_stop_daemon(daemon);
  return 0;
}

MHD_start_daemon函數包含非常多的參數,這也意味著它集成了很多的功能,這里我們只關注四個參數,其它都為NULL:

MHD_USE_INTERNAL_POLpNG_THREAD。這個參數與其他兩個參數(MHD_USE_POLL_INTERNAL_THREAD、MHD_USE_EPOLL_INTERNAL_THREAD)一起構成了microhttpd支持的三種模式:select、poll、epoll。用戶必須選擇這三種模式之一。具體信息見源碼。

port。端口號。

connectHandler。處理請求的函數。

MHD_OPTION_END。由于MHD_start_daemon最后一個參數是一個變參,因此MHD_OPTION_END用來表示變參終止。

MHD_stop_daemon函數比較簡單,這里不介紹了。

3 請求處理函數

所有的請求處理都發生在<>connectionHandler中:

int connectionHandler(
  void *cls,
  struct MHD_Connection *connection,
  const char *url,
  const char *method,
  const char *version,
  const char *upload_data,
  size_t *upload_data_size,
  void **con_cls)
{
  const char* pageBuffer = "<html><body>Hello, I'm lgxZJ!</body></html>";

  struct MHD_Response *response;
  response = MHD_create_response_from_buffer(strlen(pageBuffer),
    (void*)pageBuffer, MHD_RESPMEM_PERSISTENT);

  if (MHD_add_response_header(response, "Content-Type", "text/html") == MHD_NO) {
    std::cout << "MHD_add_response_header error\n";
    return MHD_NO;
  }
  if (MHD_queue_response(connection, MHD_HTTP_OK, response) == MHD_NO) {
    std::cout << "MHD_queue_response error\n";
    return MHD_NO;
  }
  MHD_destroy_response(response);

  return MHD_YES;
}

這個函數簽名包含了所有用來處理請求的有用信息,這里不逐一介紹了。microhttpd庫提供了函數來方便我們響應請求,這里我們重點看創建響應。microhttpd庫提供了兩種方法來創建請求:從buffer創建從文件創建。但是后者需要傳入一個文件描述符,這在windows上不是很方便。

我們這里用緩沖創建。需要注意的是最后一個參數,這是一個<>MHD_ResponseMemoryMode枚舉值,表示我們使用的buffer內容是固定不變的。這種枚舉類型還包含其他2種代表瞬時緩沖類型的值,分別表示緩沖區是在heap上的,和非heap(例如stack)上的。 用不同的緩沖區時要記得用不同的枚舉值。 接下來設置MIME類型,把緩沖入隊,并釋放MHD_Response結構體。對于正確響應,我們返回MHD_YES;不能響應的,我們返回MHD_NO。

運行程序,我們打開瀏覽器并輸入<>127.0.0.1:8888,得到如下結果:

使用Libmicrohttpd搭建內嵌(本地)服務器的方法

還能做更多

MHD_start_daemon函數還可以限制特定ip的訪問。

請求處理函數還包含請求方法請求數據

我們還可以掛起、恢復連接

以上這篇使用Libmicrohttpd搭建內嵌(本地)服務器的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湾仔区| 长顺县| 剑川县| 贵定县| 习水县| 丰顺县| 太保市| 合山市| 阿克苏市| 香格里拉县| 大石桥市| 札达县| 漳浦县| 南投县| 宝坻区| 义乌市| 虞城县| 钟山县| 陇川县| 出国| 徐水县| 余江县| 东阳市| 黑河市| 盐城市| 蒙阴县| 承德市| 麻江县| 定安县| 昌乐县| 桂东县| 临西县| 同心县| 长丰县| 舟曲县| 额尔古纳市| 精河县| 奉贤区| 鹤峰县| 西盟| 唐海县|