最新消息:

nginx中域名解析

nginx admin 3浏览
ngx 为了兼容性,同时封装了gethostbyname和getaddrinfo这两个函数来解析主机名。
<br>#if (NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6)<br>ngx_int_t<br>ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)<br>{<br>u_char *p, *host;<br>size_t len;<br>in_port_t port;<br>ngx_uint_t i;<br>struct addrinfo hints, *res, *rp;<br>struct sockaddr_in *sin;<br>struct sockaddr_in6 *sin6;<br>port = htons(u->port);<br>host = ngx_alloc(u->host.len + 1, pool->log);<br>if (host == NULL) {<br>return NGX_ERROR;<br>}<br>(void) ngx_cpystrn(host, u->host.data, u->host.len + 1);<br>ngx_memzero(&hints, sizeof(struct addrinfo));<br>hints.ai_family = AF_UNSPEC;<br>hints.ai_socktype = SOCK_STREAM;<br>#ifdef AI_ADDRCONFIG<br>hints.ai_flags = AI_ADDRCONFIG;<br>#endif<br>if (getaddrinfo((char *) host, NULL, &hints, &res) != 0) {<br>u->err = "host not found";<br>ngx_free(host);<br>return NGX_ERROR;<br>}<br>ngx_free(host);<br>for (i = 0, rp = res; rp != NULL; rp = rp->ai_next) {<br>switch (rp->ai_family) {<br>case AF_INET:<br>case AF_INET6:<br>break;<br>default:<br>continue;<br>}<br>i++;<br>}<br>if (i == 0) {<br>u->err = "host not found";<br>goto failed;<br>}<br>/* MP: ngx_shared_palloc() */<br>u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));<br>if (u->addrs == NULL) {<br>goto failed;<br>}<br>u->naddrs = i;<br>i = 0;<br>/* AF_INET addresses first */<br>for (rp = res; rp != NULL; rp = rp->ai_next) {<br>if (rp->ai_family != AF_INET) {<br>continue;<br>}<br>sin = ngx_pcalloc(pool, rp->ai_addrlen);<br>if (sin == NULL) {<br>goto failed;<br>}<br>ngx_memcpy(sin, rp->ai_addr, rp->ai_addrlen);<br>sin->sin_port = port;<br>u->addrs[i].sockaddr = (struct sockaddr *) sin;<br>u->addrs[i].socklen = rp->ai_addrlen;<br>len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;<br>p = ngx_pnalloc(pool, len);<br>if (p == NULL) {<br>goto failed;<br>}<br>len = ngx_sock_ntop((struct sockaddr *) sin, rp->ai_addrlen, p, len, 1);<br>u->addrs[i].name.len = len;<br>u->addrs[i].name.data = p;<br>i++;<br>}<br>for (rp = res; rp != NULL; rp = rp->ai_next) {<br>if (rp->ai_family != AF_INET6) {<br>continue;<br>}<br>sin6 = ngx_pcalloc(pool, rp->ai_addrlen);<br>if (sin6 == NULL) {<br>goto failed;<br>}<br>ngx_memcpy(sin6, rp->ai_addr, rp->ai_addrlen);<br>sin6->sin6_port = port;<br>u->addrs[i].sockaddr = (struct sockaddr *) sin6;<br>u->addrs[i].socklen = rp->ai_addrlen;<br>len = NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1;<br>p = ngx_pnalloc(pool, len);<br>if (p == NULL) {<br>goto failed;<br>}<br>len = ngx_sock_ntop((struct sockaddr *) sin6, rp->ai_addrlen, p,<br>len, 1);<br>u->addrs[i].name.len = len;<br>u->addrs[i].name.data = p;<br>i++;<br>}<br>freeaddrinfo(res);<br>return NGX_OK;<br>failed:<br>freeaddrinfo(res);<br>return NGX_ERROR;<br>}<br>#else /* !NGX_HAVE_GETADDRINFO \|\| !NGX_HAVE_INET6 */<br>ngx_int_t<br>ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)<br>{<br>u_char *p, *host;<br>size_t len;<br>in_port_t port;<br>in_addr_t in_addr;<br>ngx_uint_t i;<br>struct hostent *h;<br>struct sockaddr_in *sin;<br>/* AF_INET only */<br>port = htons(u->port);<br>in_addr = ngx_inet_addr(u->host.data, u->host.len);<br>if (in_addr == INADDR_NONE) {<br>host = ngx_alloc(u->host.len + 1, pool->log);<br>if (host == NULL) {<br>return NGX_ERROR;<br>}<br>(void) ngx_cpystrn(host, u->host.data, u->host.len + 1);<br>h = gethostbyname((char *) host);<br>ngx_free(host);<br>if (h == NULL \|\| h->h_addr_list[0] == NULL) {<br>u->err = "host not found";<br>return NGX_ERROR;<br>}<br>for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ }<br>/* MP: ngx_shared_palloc() */<br>u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));<br>if (u->addrs == NULL) {<br>return NGX_ERROR;<br>}<br>u->naddrs = i;<br>for (i = 0; i < u->naddrs; i++) {<br>sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));<br>if (sin == NULL) {<br>return NGX_ERROR;<br>}<br>sin->sin_family = AF_INET;<br>sin->sin_port = port;<br>sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);<br>u->addrs[i].sockaddr = (struct sockaddr *) sin;<br>u->addrs[i].socklen = sizeof(struct sockaddr_in);<br>len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;<br>p = ngx_pnalloc(pool, len);<br>if (p == NULL) {<br>return NGX_ERROR;<br>}<br>len = ngx_sock_ntop((struct sockaddr *) sin,<br>sizeof(struct sockaddr_in), p, len, 1);<br>u->addrs[i].name.len = len;<br>u->addrs[i].name.data = p;<br>}<br>} else {<br>/* MP: ngx_shared_palloc() */<br>u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));<br>if (u->addrs == NULL) {<br>return NGX_ERROR;<br>}<br>sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));<br>if (sin == NULL) {<br>return NGX_ERROR;<br>}<br>u->naddrs = 1;<br>sin->sin_family = AF_INET;<br>sin->sin_port = port;<br>sin->sin_addr.s_addr = in_addr;<br>u->addrs[0].sockaddr = (struct sockaddr *) sin;<br>u->addrs[0].socklen = sizeof(struct sockaddr_in);<br>p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);<br>if (p == NULL) {<br>return NGX_ERROR;<br>}<br>u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",<br>&u->host, ntohs(port)) - p;<br>u->addrs[0].name.data = p;<br>}<br>return NGX_OK;<br>}<br>#endif /* NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6 */<br>

相关文章

转载请注明:爱开源 » nginx中域名解析

转载请注明:爱开源 » nginx中域名解析