天天看點

ngx_connection_t結構體

//伺服器的被動連接配接

struct ngx_connection_s {
    //連接配接未使用時候,data域充當連接配接連結清單中的next指針.
	//當連接配接被使用時候,data域的意義由子產品而定.
    void               *data;
	//連接配接對應的讀事件
    ngx_event_t        *read;
	//連接配接對應的寫事件
    ngx_event_t        *write;

    //套接字句柄
	ngx_socket_t        fd;

    //直接接收網絡位元組流的方法
	ngx_recv_pt         recv;
	//直接放松網絡位元組流的方法
    ngx_send_pt         send;
	//以ngx_chain連結清單為參數,接收網絡位元組流的方法
    ngx_recv_chain_pt   recv_chain;
	//以ngx_chain連結清單為參數,發送網絡位元組流的方法
    ngx_send_chain_pt   send_chain;

    //這個連結對應的listening_t監聽對象.
	//此連結由ngx_listening_t監聽的事件建立
	ngx_listening_t    *listening;

    //這個連接配接已經發送出去的位元組數
	off_t               sent;

    //記錄日志
	ngx_log_t          *log;

    //在accept一個新連接配接的時候,會建立一個記憶體池,而這個連接配接結束時候,會銷毀一個記憶體池.
	//這裡所說的連接配接是成功建立的tcp連接配接.記憶體池的大小由pool_size決定
	//所有的ngx_connect_t結構體都是預配置設定的
	ngx_pool_t         *pool;

    //連接配接用戶端的結構體
	struct sockaddr    *sockaddr;
    //連接配接用戶端的結構體長度
	socklen_t           socklen;
	//連接配接用戶端的ip(字元串形式)
    ngx_str_t           addr_text;

#if (NGX_SSL)
    ngx_ssl_connection_t  *ssl;
#endif

    //本機中監聽端口對應的socketaddr結構體
	//也就是listen監聽對象中的socketaddr成員
	struct sockaddr    *local_sockaddr;

    //用于接收和緩存用戶端發來的字元流
	ngx_buf_t          *buffer;

    //該字段表示将該連接配接以雙向連結清單形式添加到cycle結構體中的
	//reusable_connections_queen雙向連結清單中,表示可以重用的連接配接.
	ngx_queue_t         queue;

    //連接配接使用次數,每次建立一條來自用戶端的連接配接,
	//或者建立一條與後端伺服器的連接配接,number+1
	ngx_atomic_uint_t   number;

    //處理請求的次數
	ngx_uint_t          requests;

    //
	unsigned            buffered:8;

    //日志級别
	unsigned            log_error:3;     /* ngx_connection_log_error_e */

    //不期待字元流結束
	unsigned            unexpected_eof:1;
    //連接配接逾時
	unsigned            timedout:1;
    //連接配接處理過程中出現錯誤
	unsigned            error:1;
    //辨別此連結已經銷毀,記憶體池,套接字等都不可用
	unsigned            destroyed:1;

    //連接配接處于空閑狀态
	unsigned            idle:1;
    //連接配接可以重用
	unsigned            reusable:1;
    //連接配接關閉
	unsigned            close:1;

    //正在将檔案中的資料法網另一端
	unsigned            sendfile:1;
	//連接配接中發送緩沖區的資料高于低潮,才發送資料.
	//與ngx_handle_write_event方法中的lowat相對應
    unsigned            sndlowat:1;
	//使用tcp的nodely特性
    unsigned            tcp_nodelay:2;   /* ngx_connection_tcp_nodelay_e */
    //使用tcp的nopush特性
	unsigned            tcp_nopush:2;    /* ngx_connection_tcp_nopush_e */

#if (NGX_HAVE_IOCP)
    unsigned            accept_context_updated:1;
#endif

#if (NGX_HAVE_AIO_SENDFILE)
    unsigned            aio_sendfile:1;
    ngx_buf_t          *busy_sendfile;
#endif

#if (NGX_THREADS)
    ngx_atomic_t        lock;
#endif
};
           

繼續閱讀