//當建立連線後開闢ngx_http_connection_t結構,這裡面儲存該伺服器端ip:port所在server{}上下文配置資訊,和server_name資訊等,然後讓
//ngx_connection_t->data指向該結構,這樣就可以通過ngx_connection_t->data獲取到伺服器端的serv loc 等配置資訊以及該server{}中的server_name資訊
//在伺服器端accept客戶端連線成功(ngx_event_accept)後,通過ngx_get_connection從連線池獲取乙個ngx_connection_t結構,
//每個客戶端連線對於乙個ngx_connection_t結構,並且為其分配乙個ngx_http_connection_t結構,ngx_connection_t->data = ngx_http_connection_t,
c->data =hc;
/*find the server configuration for the address:port
*/port = c->listening->servers;
if (port->naddrs > 1
)
switch (c->local_sockaddr->sa_family)
}hc->addr_conf = &addr6[i].conf;
break
;#endif
default: /*
af_inet
*/sin = (struct sockaddr_in *) c->local_sockaddr;
addr = port->addrs;
/*the last address is "*"
*///
根據上面的ngx_connection_local_sockaddr函式獲取到客戶端連線到本地,本地ip位址獲取到後,遍歷ngx_http_port_t找到對應
//的ip位址和埠,然後賦值給ngx_http_connection_t->addr_conf,這裡面儲存有server_name配置資訊以及該ip:port對應的上下文資訊
for (i = 0; i < port->naddrs - 1; i++)
}/*這裡也體現了在ngx_http_init_connection中獲取http{}上下文ctx,如果客戶端請求中帶有host引數,則會繼續在ngx_http_set_virtual_server
中重新獲取對應的server{}和location{},如果客戶端請求不帶host頭部行,則使用預設的server{},見 ngx_http_init_connection
*/hc->addr_conf = &addr[i].conf;
break
; }
} else
}/*the default server configuration for the address:port
*///
listen add:port對於的 server{}配置塊的上下文ctx
//設定read-ev 的**
/*這裡放在ssl的前面是,如果沒有配置ssl,則直接不用進行ssl協商而進行http2處理ngx_http_v2_init
如果是 ssl/tls 後面 會進入 tls 的握手 並且關聯sock-fd和 ssl 同時設定read-ev的**解析tls協商
/*如果新連線的讀事件ngx_event_t結構體中的標誌位ready為1,實際上表示這個連線對應的套接字快取上已經有使用者發來的資料,
這時就可呼叫上面說過的ngx_http_init_request方法處理請求。
*///
這裡只可能是當listen的時候新增了defered引數並且核心支援,在ngx_event_accept的時候才會置1,才可能執行下面的if裡面的內容,否則不會只需if裡面的內容
/*在有些情況下,當tcp連線建立成功時同時也出現了可讀事件(例如,在套接字listen配置時設定了deferred選項時,核心僅在套接字上確實收到請求時才會通知epoll
排程事件的**方法。當然,在大部分情況下,ngx_http_init_request方法和
ngx_http_init_connection方法都是由兩個事件(tcp連線建立成功事件和連線上的可讀事件)觸發呼叫的
*//*
呼叫ngx_add_timer方法把讀事件新增到定時器中,設定的超時時間則是nginx.conf中client_header_timeout配置項指定的引數。
也就是說,如果經過client_header_timeout時間後這個連線上還沒有使用者資料到達,則會由定時器觸發呼叫讀事件的ngx_http_init_request處理方法。
*///
把接收事件新增到定時器中,當post_accept_timeout秒還沒有客戶端資料到來,就關閉連線-----乾掉 idle 連線
ngx_add_timer(rev, c->listening->post_accept_timeout, ngx_func_line);
ngx_reusable_connection(c, 1);
//將fd epoll add 到 ep 監聽;當下次有資料從客戶端傳送過來的時候,會在ngx_epoll_process_events把對應的ready置1。
if (ngx_handle_read_event(rev, 0, ngx_func_line) != ngx_ok)
}
結構體初始化 指定初始化
參考 c99支援結構的指定初始化專案,其語法與陣列的指定初始化專案近似。只是,結構的指定初始化專案使用點運算子和成員名 而不是方括號和索引值 來標識具體的元素。例如,只初始化book結構的成員value,可以這樣做 struct book surprise 可以按照任意的順序使用指定初始化專案 st...
結構體初始化
結構體變數初始化 tag 結構體,結構體變數,結構體變數宣告,結構體變數初始化,結構體變數引用,結構體成員變數引用 text c語言中引用變數的基本原則是在使用變數前,需要對變數進行定義並初始化。其方法是在定義變數的同時給其一初始值。結構體變數的初始化,遵循相同的規律。簡單變數的初始化形式如下 資料...
初始化專案結構
syl注 建立三個python包,使用pycharm開啟專案 1.右擊 編輯配置 2.檔案 設定 3.檔案 設定 建立user模型 urlpatterns path user include user.urls sys path insert 0 os.path join base dir,from...