⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_connection.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
            {                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,                              "setsockopt(TCP_NODELAY) %V failed, ignored",                              &ls[i].addr_text);            }        }#endif        if (ls[i].listen) {            /* change backlog via listen() */            if (listen(ls[i].fd, ls[i].backlog) == -1) {                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,                              "listen() to %V, backlog %d failed, ignored",                              &ls[i].addr_text, ls[i].backlog);            }        }        /*         * setting deferred mode should be last operation on socket,         * because code may prematurely continue cycle on failure         */#if (NGX_HAVE_DEFERRED_ACCEPT)#ifdef SO_ACCEPTFILTER        if (ls[i].delete_deferred) {            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)                == -1)            {                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                              "setsockopt(SO_ACCEPTFILTER, NULL) "                              "for %V failed, ignored",                              &ls[i].addr_text);                if (ls[i].accept_filter) {                    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                                  "could not change the accept filter "                                  "to \"%s\" for %V, ignored",                                  ls[i].accept_filter, &ls[i].addr_text);                }                continue;            }            ls[i].deferred_accept = 0;        }        if (ls[i].add_deferred) {            ngx_memzero(&af, sizeof(struct accept_filter_arg));            (void) ngx_cpystrn((u_char *) af.af_name,                               (u_char *) ls[i].accept_filter, 16);            if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER,                           &af, sizeof(struct accept_filter_arg))                == -1)            {                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                              "setsockopt(SO_ACCEPTFILTER, \"%s\") "                              " for %V failed, ignored",                              ls[i].accept_filter, &ls[i].addr_text);                continue;            }            ls[i].deferred_accept = 1;        }#endif#ifdef TCP_DEFER_ACCEPT        if (ls[i].add_deferred || ls[i].delete_deferred) {            if (ls[i].add_deferred) {                timeout = (int) (ls[i].post_accept_timeout / 1000);            } else {                timeout = 0;            }            if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_DEFER_ACCEPT,                           &timeout, sizeof(int))                == -1)            {                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                              "setsockopt(TCP_DEFER_ACCEPT, %d) for %V failed, "                              "ignored",                              timeout, &ls[i].addr_text);                continue;            }        }        if (ls[i].add_deferred) {            ls[i].deferred_accept = 1;        }#endif#endif /* NGX_HAVE_DEFERRED_ACCEPT */    }    return;}voidngx_close_listening_sockets(ngx_cycle_t *cycle){    ngx_uint_t         i;    ngx_listening_t   *ls;    ngx_connection_t  *c;    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {        return;    }    ngx_accept_mutex_held = 0;    ngx_use_accept_mutex = 0;    ls = cycle->listening.elts;    for (i = 0; i < cycle->listening.nelts; i++) {        c = ls[i].connection;        if (c->read->active) {            if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {                ngx_del_conn(c, NGX_CLOSE_EVENT);            } else if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {                /*                 * it seems that Linux-2.6.x OpenVZ sends events                 * for closed shared listening sockets unless                 * the events was explicity deleted                 */                ngx_del_event(c->read, NGX_READ_EVENT, 0);            } else {                ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);            }        }        ngx_free_connection(c);        c->fd = (ngx_socket_t) -1;        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,                       "close listening %V #%d ", &ls[i].addr_text, ls[i].fd);        if (ngx_close_socket(ls[i].fd) == -1) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,                          ngx_close_socket_n " %V failed", &ls[i].addr_text);        }    }}ngx_connection_t *ngx_get_connection(ngx_socket_t s, ngx_log_t *log){    ngx_uint_t         instance;    ngx_event_t       *rev, *wev;    ngx_connection_t  *c;    /* disable warning: Win32 SOCKET is u_int while UNIX socket is int */    if (ngx_cycle->files && (ngx_uint_t) s >= ngx_cycle->files_n) {        ngx_log_error(NGX_LOG_ALERT, log, 0,                      "the new socket has number %d, "                      "but only %ui files are available",                      s, ngx_cycle->files_n);        return NULL;    }    /* ngx_mutex_lock */    c = ngx_cycle->free_connections;    if (c == NULL) {        ngx_log_error(NGX_LOG_ALERT, log, 0,                      "%ui worker_connections is not enough",                      ngx_cycle->connection_n);        /* ngx_mutex_unlock */        return NULL;    }    ngx_cycle->free_connections = c->data;    ngx_cycle->free_connection_n--;    /* ngx_mutex_unlock */    if (ngx_cycle->files) {        ngx_cycle->files[s] = c;    }    rev = c->read;    wev = c->write;    ngx_memzero(c, sizeof(ngx_connection_t));    c->read = rev;    c->write = wev;    c->fd = s;    c->log = log;    instance = rev->instance;    ngx_memzero(rev, sizeof(ngx_event_t));    ngx_memzero(wev, sizeof(ngx_event_t));    rev->instance = !instance;    wev->instance = !instance;    rev->index = NGX_INVALID_INDEX;    wev->index = NGX_INVALID_INDEX;    rev->data = c;    wev->data = c;    wev->write = 1;    return c;}voidngx_free_connection(ngx_connection_t *c){    /* ngx_mutex_lock */    c->data = ngx_cycle->free_connections;    ngx_cycle->free_connections = c;    ngx_cycle->free_connection_n++;    /* ngx_mutex_unlock */    if (ngx_cycle->files) {        ngx_cycle->files[c->fd] = NULL;    }}voidngx_close_connection(ngx_connection_t *c){    ngx_err_t     err;    ngx_uint_t    log_error, level;    ngx_socket_t  fd;    if (c->fd == -1) {        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "connection already closed");        return;    }    if (c->read->timer_set) {        ngx_del_timer(c->read);    }    if (c->write->timer_set) {        ngx_del_timer(c->write);    }    if (ngx_del_conn) {        ngx_del_conn(c, NGX_CLOSE_EVENT);    } else {        if (c->read->active || c->read->disabled) {            ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);        }        if (c->write->active || c->write->disabled) {            ngx_del_event(c->write, NGX_WRITE_EVENT, NGX_CLOSE_EVENT);        }    }#if (NGX_THREADS)    /*     * we have to clean the connection information before the closing     * because another thread may reopen the same file descriptor     * before we clean the connection     */    ngx_mutex_lock(ngx_posted_events_mutex);    if (c->read->prev) {        ngx_delete_posted_event(c->read);    }    if (c->write->prev) {        ngx_delete_posted_event(c->write);    }    c->read->closed = 1;    c->write->closed = 1;    if (c->single_connection) {        ngx_unlock(&c->lock);        c->read->locked = 0;        c->write->locked = 0;    }    ngx_mutex_unlock(ngx_posted_events_mutex);#else    if (c->read->prev) {        ngx_delete_posted_event(c->read);    }    if (c->write->prev) {        ngx_delete_posted_event(c->write);    }    c->read->closed = 1;    c->write->closed = 1;#endif    log_error = c->log_error;    ngx_free_connection(c);    fd = c->fd;    c->fd = (ngx_socket_t) -1;    if (ngx_close_socket(fd) == -1) {        err = ngx_socket_errno;        if (err == NGX_ECONNRESET || err == NGX_ENOTCONN) {            switch (log_error) {            case NGX_ERROR_INFO:                level = NGX_LOG_INFO;                break;            case NGX_ERROR_ERR:                level = NGX_LOG_ERR;                break;            default:                level = NGX_LOG_CRIT;            }        } else {            level = NGX_LOG_CRIT;        }        /* we use ngx_cycle->log because c->log was in c->pool */        ngx_log_error(level, ngx_cycle->log, err,                      ngx_close_socket_n " %d failed", fd);    }}ngx_int_tngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text){    ngx_uint_t  level;    if (err == NGX_ECONNRESET        && c->log_error == NGX_ERROR_IGNORE_ECONNRESET)    {        return 0;    }    if (err == 0        || err == NGX_ECONNRESET#if !(NGX_WIN32)        || err == NGX_EPIPE#endif        || err == NGX_ENOTCONN        || err == NGX_ETIMEDOUT        || err == NGX_ECONNREFUSED        || err == NGX_ENETDOWN        || err == NGX_ENETUNREACH        || err == NGX_EHOSTDOWN        || err == NGX_EHOSTUNREACH)    {        switch (c->log_error) {        case NGX_ERROR_IGNORE_ECONNRESET:        case NGX_ERROR_INFO:            level = NGX_LOG_INFO;            break;        case NGX_ERROR_ERR:            level = NGX_LOG_ERR;            break;        default:            level = NGX_LOG_ALERT;        }    } else {        level = NGX_LOG_ALERT;    }    ngx_log_error(level, c->log, err, text);    return NGX_ERROR;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -