分析用サンプルコードフレームをマングース()
参考:
はじめに:
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)予備一見。
ハム、多くのメソッド呼び出し、定数や構造のフレームに閉鎖されています
- 構造:
- mg_mgr
- mg_connection
- mg_serve_http_opts
- メソッドの呼び出し:
- mg_mgr_init
- mg_bind
- mg_serve_http
- mg_set_protocol_http_websocket
- mg_mgr_pool
- mg_mgr_free
- 定数:
- 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の良い〜