//一般是管理一个已经连接好的tcp连接,作为服务的时候保持的是一个被动连接(也就是accpet出来的),可以作为客户端的连接(作反向代理的时候,作为客户端主动去连上游(upsream)或者源站服务器)。
struct ngx_connection_s {
void *data;//如果是http协议的话,该指针指向类型为ngx_http_connection_t的结构体
ngx_event_t *read;//socket读事件通知函数,其中它的成员data指向的就是跟它关联的ngx_connection_t,对于监听socket则监听处理函数为ngx_event_accept,对于客户端是用http连接过来的,处理函数指向ngx_http_wait_request_handler,对于keepalive保存下来的连接,该事件的处理函数为ngx_http_wait_request_handler,而且在请求不同的阶段,事件通知函数会动态变化
ngx_event_t *write;//socket写事件通知函数,其中它的成员data指向的就是跟它关联的ngx_connection_t
ngx_socket_t fd;//socket的文件描述符
ngx_recv_pt recv;//从网络接收数据的函数,一次只能接收到一个缓冲区,该函数封装了不同的平台接收函数,以及屏蔽了底层协议的依赖。windows和linux都有实现自己不同的收数据方式。同时如果要支持https,也是通过修改该函数的实现来完成的。
ngx_send_pt send;//将数据发送到网络的函数,一次只能发送一个缓冲区的数据,该函数封装了不同的平台接收函数,以及屏蔽了底层协议的依赖。windows和linux都有实现自己不同的收数据方式。同时如果要支持https,也是通过修改该函数的实现来完成的。
ngx_recv_chain_pt recv_chain;//从网络接收数据的函数,能够将接手数据写到多个不连续的缓冲区,该函数封装了不同的平台接收函数,以及屏蔽了底层协议的依赖。windows和linux都有实现自己不同的收数据方式。同时如果要支持https,也是通过修改该函数的实现来完成的。
ngx_send_chain_pt send_chain;//将数据发送到网络的函数,一次能够发送多个不连续缓冲区的数据,该函数封装了不同的平台接收函数,以及屏蔽了底层协议的依赖。windows和linux都有实现自己不同的收数据方式。同时如果要支持https,也是通过修改该函数的实现来完成的。
ngx_listening_t *listening;//与该connection相关的监听信息,这个信息是从监听connection传递给接收到哦connection的。
off_t sent;
ngx_log_t *log;
ngx_pool_t *pool;
int type;
struct sockaddr *sockaddr;
socklen_t socklen;
ngx_str_t addr_text;
ngx_str_t proxy_protocol_addr;
#if (NGX_SSL)
ngx_ssl_connection_t *ssl;
#endif
struct sockaddr *local_sockaddr;
socklen_t local_socklen;
ngx_buf_t *buffer;
ngx_queue_t queue;
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 shared:1;
unsigned sendfile:1;
unsigned sndlowat:1;
unsigned tcp_nodelay:2; /* ngx_connection_tcp_nodelay_e */
unsigned tcp_nopush:2; /* ngx_connection_tcp_nopush_e */
unsigned need_last_buf:1;
#if (NGX_HAVE_IOCP)
unsigned accept_context_updated:1;
#endif
#if (NGX_HAVE_AIO_SENDFILE)
unsigned busy_count:2;
#endif
#if (NGX_THREADS)
ngx_thread_task_t *sendfile_task;
#endif
};