http 結構初始化

2022-06-16 03:57:09 字數 3664 閱讀 3077

//當建立連線後開闢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...