分析用サンプルコードフレームをマングース()

分析用サンプルコードフレームをマングース()


参考:

  1. マングースネットワークライブラリのドキュメント(サーバー)
  2. マングースネットワークライブラリのドキュメント(クライアント)

はじめに:

OK、おかげで完成恩人、書き込みに9年を経過した後、昨日、ちなみに〜今日のテキストでそれを見て、再びブログトップ半分の愛にそれに遭遇しましたが、自分自身に刺激するいくつかの時間を与えます。ここにもリンクを入れて、はい、私はこのスキンについて非常に幸せです!ブログ-CSDNブログ_qq_31433709のMAC Cのソースコードの下でコンパイルプロセスの予備的な理解

私は名前が本当に科学である、と言っているだけでなく、これらの2つのソースファイルのメソッドのパラメータ名の名前は完璧一目です!

すべてのすべてで、vimの上のI Cの環境はまだそれを得ない、このコード行のプロセスと十分ではない感じ本当に幸せ!夜に方法は、それを取得します!(これはかなり非現実的であるが)あなたが見つからない場合は、それはそれ= =プラグ書く方法を学ぶための方法です!


テキスト

サーバー側:

ソースファイル:simplest_web_server.c

// Copyright (c) 2015 Cesanta Software Limited
// All rights reserved

#include "mongoose.h"

static const char *s_http_port = "8000";
static struct mg_serve_http_opts s_http_server_opts;

static void ev_handler(struct mg_connection *nc, int ev, void *p) {
  if (ev == MG_EV_HTTP_REQUEST) {
    mg_serve_http(nc, (struct http_message *) p, s_http_server_opts);
  }
}

int main(void) {
  struct mg_mgr mgr;
  struct mg_connection *nc;

  mg_mgr_init(&mgr, NULL);
  printf("Starting web server on port %s\n", s_http_port);
  nc = mg_bind(&mgr, s_http_port, ev_handler);
  if (nc == NULL) {
    printf("Failed to create listener\n");
    return 1;
  }

  // Set up HTTP server parameters
  mg_set_protocol_http_websocket(nc);
  s_http_server_opts.document_root = ".";  // Serve current directory
  s_http_server_opts.enable_directory_listing = "yes";

  for (;;) {
    mg_mgr_poll(&mgr, 1000);
  }
  mg_mgr_free(&mgr);

  return 0;
}

(1)予備一見。

ハム、多くのメソッド呼び出し、定数や構造のフレームに閉鎖されています

  1. 構造:
  • mg_mgr
  • mg_connection
  • mg_serve_http_opts
  1. メソッドの呼び出し:
  • mg_mgr_init
  • mg_bind
  • mg_serve_http
  • mg_set_protocol_http_websocket
  • mg_mgr_pool
  • mg_mgr_free
  1. 定数:
  • MG_EV_HTTP_REQUEST

インポートのみ1つのヘッダファイル、詠唱見てそこに行く= =、すごい、6277 OKは、[OK]を、子供たちは、あなたが質問がありますか?
ヘッダファイルは、私は、私はまだ取得する.cファイルから感じる、ほとんどの定数を感じるし、メソッドの実装と構造を定義取得することができます。

(2)それは眼鏡ファイルを見てみます

vimのグローバル検索、結果の行に定義、井戸の残りの部分を見つけることがMG_EV_HTTP_REQUEST、記載されていることがしたかったが、簡単の長さのために、またはより良い省略していたが、個人的な感情は(おそらくビットを目指して〜)、そして私は、両方のことがわかりました構造やメソッド呼び出しまたは一定で、ヘッダファイルの内部では非常に具体的に説明し、さらにサンプルコードがあり、それが直接独自の検索mongoose.hファイルとパラメータが1000のためmg_mgr_poolことを提案する、または.Cファイルを検索する必要性特定の実装

そして、これはすべての後に、この分野での書き込み内容に第一号だったポイントの差があるが、すべての後に、自己改善(自己慰め)用で、私は一般的に円になり理由である、と貧しいから良いまあ、総プロセス!

// Copyright (c) 2015 Cesanta Software Limited
// All rights reserved

//导入mongoose所依赖的必须头文件
#include "mongoose.h"

//指定默认的服务器http端口号
static const char *s_http_port = "8000";
//指定http链接的各种选项
static struct mg_serve_http_opts s_http_server_opts;

//ev_handler指定的event handler,即事件处理,mg指代的是mongoose
static void ev_handler(struct mg_connection *nc, int ev, void *p) {
  if (ev == MG_EV_HTTP_REQUEST) {
    mg_serve_http(nc, (struct http_message *) p, s_http_server_opts);
  }
}

//总入口,一切的开始
int main(void) {
  struct mg_mgr mgr;
  struct mg_connection *nc;

  //初始化mg_mar变量
  mg_mgr_init(&mgr, NULL);
  printf("Starting web server on port %s\n", s_http_port);
  //这里有点函数式的感觉,传入的不是对象,而是方法指针
  //将mgr和其中的mgr_connection以及对应的端口号还有对应的不同event的处理器所绑定,并返回对应的绑定后的mg_connection对象
  nc = mg_bind(&mgr, s_http_port, ev_handler);

  if (nc == NULL) {
    printf("Failed to create listener\n");
    return 1;
  }

  // Set up HTTP server parameters
  mg_set_protocol_http_websocket(nc);
  //设置客户端访问服务器的初始路径,这里设置为"."即为可执行文件的当前路径
  s_http_server_opts.document_root = ".";  // Serve current directory
  //同时设置是否支持显示当前目录下的文件信息
  s_http_server_opts.enable_directory_listing = "yes";

  for (;;) {
    //这里的1000是什么意思呢?
    //翻译一下文档中对这个方法的描述:
    //这个方法执行实际上的IO操作并且必须在一个循环中被调用(一个事件循环)。
    //它返回了生成的用户事件数目(除了POLL)。
    //第二个参数是以毫秒为单位的睡眠最大时间。
    //该方法为IO操作检查了所有的连接(connection)。如果至少有一个连接已经准备好IO操作,此方法将切换到对应的事件处理器然后返回。
    mg_mgr_poll(&mgr, 1000);
    //所以说,1000到底是什么意思?看来光看头文件比较难啊。
    //ok,大概看了看实现,1000是设置的请求超时时间
  }
  //解构mg_mgr,该方法中应该同时解构了mg_connection,并释放了对应占用的内存,道理的确是这样,但是什么情况下会跳出这个死循环呢?如果我直接通过信号,貌似不会走这步,并没有看见输出stopped的信息
  mg_mgr_free(&mgr);
    printf("stopped mongoose server");
  return 0;
}


要約:

OK、ほとんどこのプログラムを参照するだけでなく、いくつかの詳細を確認するために、適切なために今日感じ、プロセス・サーバーは、基本的には、円の中に理由です。Zaoshuizaoqiの良い〜

公開された306元の記事 ウォン称賛26 ビュー120 000 +

おすすめ

転載: blog.csdn.net/qq_31433709/article/details/105352282