最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年08月14日 08:22:54   投稿:jingxian  
下面小編就為大家?guī)硪黄褂肔ibmicrohttpd搭建內(nèi)嵌(本地)服務器的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Libmicrohttpd簡介

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

C語言庫,小而快。

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

兼容HTTP1.1。

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

跨平臺。

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

搭建一個簡單的本地靜態(tài)服務器

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

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

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

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

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

2. main函數(shù)

main函數(shù)非常簡單,核心調(diào)用只有2個函數(shù):<>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函數(shù)包含非常多的參數(shù),這也意味著它集成了很多的功能,這里我們只關(guān)注四個參數(shù),其它都為NULL:

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

port。端口號。

connectHandler。處理請求的函數(shù)。

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

MHD_stop_daemon函數(shù)比較簡單,這里不介紹了。

3 請求處理函數(shù)

所有的請求處理都發(fā)生在<>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;
}

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

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

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

pic-result

還能做更多

MHD_start_daemon函數(shù)還可以限制特定ip的訪問。

請求處理函數(shù)還包含請求方法請求數(shù)據(jù)

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

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

相關(guān)文章

  • C++ std::bind用法詳解

    C++ std::bind用法詳解

    這篇文章主要介紹了C++ std::bind用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C語言實現(xiàn)十六進制與二進制的相互轉(zhuǎn)換

    C語言實現(xiàn)十六進制與二進制的相互轉(zhuǎn)換

    這篇文章主要為大家詳細介紹了如何利用c語言實現(xiàn)將文件中十六進制數(shù)據(jù)與二進制數(shù)據(jù)相互轉(zhuǎn)換,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的可以學習一下
    2022-11-11
  • c++ vector模擬實現(xiàn)的全過程

    c++ vector模擬實現(xiàn)的全過程

    這篇文章主要給大家介紹了關(guān)于c++ vector的模擬實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C語言中使用qsort函數(shù)對自定義結(jié)構(gòu)體數(shù)組進行排序

    C語言中使用qsort函數(shù)對自定義結(jié)構(gòu)體數(shù)組進行排序

    這篇文章主要介紹了C語言中使用qsort函數(shù)對自定義結(jié)構(gòu)體數(shù)組進行排序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++多態(tài)與虛擬之C++編譯器對函數(shù)名的改編(Name?Mangling)

    C++多態(tài)與虛擬之C++編譯器對函數(shù)名的改編(Name?Mangling)

    在Windows?DLLs中,使用C++編寫的DllMain()等callback函數(shù)需避免C++編譯器進行name?mangling,因此需使用extern?"C",這篇文章主要介紹了C++多態(tài)與虛擬:C++編譯器對函數(shù)名的改編(Name?Mangling),需要的朋友可以參考下
    2024-04-04
  • c語言函數(shù)如何求兩個數(shù)的最大值

    c語言函數(shù)如何求兩個數(shù)的最大值

    這篇文章主要介紹了c語言函數(shù)如何求兩個數(shù)的最大值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 標準CSV格式的介紹和分析以及解析算法實例詳解

    標準CSV格式的介紹和分析以及解析算法實例詳解

    這篇文章主要介紹了標準CSV格式的介紹和分析以及解析算法實例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • C++11 <future>中std::promise 介紹

    C++11 <future>中std::promise 介紹

    這篇文章主要介紹了C++11 <future>中std::promise 介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C語言深入探究選擇排序與基數(shù)排序使用案例講解

    C語言深入探究選擇排序與基數(shù)排序使用案例講解

    算法中排序是十分重要的,而每一個學習計算機的都會在初期的時候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語言選擇排序與基數(shù)排序使用的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 帶你了解C++this指針的用法及其深究

    帶你了解C++this指針的用法及其深究

    這篇文章主要介紹了C++中this指針的用法,對初學者而言是非常重要的概念,必須加以熟練掌握,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08

最新評論

天全县| 长丰县| 蓝山县| 闽清县| 广平县| 汪清县| 东海县| 辉南县| 七台河市| 宣城市| 永安市| 岳阳市| 兴文县| 桂阳县| 比如县| 红安县| 广西| 岢岚县| 五指山市| 东辽县| 禹城市| 淮安市| 乌兰浩特市| 崇仁县| 莒南县| 金阳县| 呈贡县| 驻马店市| 景宁| 旬阳县| 咸阳市| 同江市| 克东县| 阳原县| 上林县| 兴仁县| 沅江市| 连云港市| 淮南市| 蕲春县| 桑日县|