本节我们主要分析一下nginx网络地址相关操作。
1. 相关静态函数声明
2. 函数ngx_inet_addr()
此函数用于将字符串表示形式的IPv4地址转换成in_addr_t
表示形式。转换出错,返回INADDR_NONE
。
2. 函数ngx_inet6_addr()
这里我们暂不支持NGX_HAVE_INET6
,函数ngx_inet6_addr()用于将字符串表示形式的IPv6地址转换成128bit位的地址。IPv6地址的表示形式一般为:
2001:0410:0000:1234:FB00:1400:5000:45FF //首选格式
2001:0410 :: 1234:FB00:1400:5000:45FF //压缩格式(注意压缩格式中,只能有一个地方压缩)
0:0:0:0:0:0:138.1.1.1 //内嵌IPv4
下面我们来详细介绍一下ngx_inet6_addr():
3. 函数ngx_sock_ntop()
本函数用于将sockaddr
表示形式的地址(IPv4/IPv6/Unix Domain),转换成字符串表示形式。(注意:这里如果地址是IPv4/IPv6,也会对port参数进行转换)
4. 函数ngx_inet_ntop()
这里对IPv4/IPv6地址转换成字符串表示形式。
5. 函数ngx_inet_ntop()
这里对128bit的IPv6地址转换成IPv6字符串表示形式。下面详细介绍一下该函数:
6. 函数ngx_ptocidr()
本函数用于将字符串转换成无类域间路由。该函数实现较为简单,我们简单介绍一下:
7. 函数ngx_parse_addr()
本函数用于将字符串表示的IPv4/IPv6地址转换成ngx_addr_t形式。
8. 函数ngx_parse_url()
本函数用于解析url,分三种类型:
-
unix域URL: 调用ngx_parse_unix_domain_url(),例如unix:/var/run/nginx.sock
-
IPv6 URL: 调用ngx_parse_inet6_url(),例如[::1]:5353
-
IPv4 URL: 调用ngx_parse_inet_url(),例如127.0.0.1:12345
9. 函数ngx_parse_unix_domain_url()
本函数用于解析ngx_url_t.url
,主要会解析成以下几个部分:
-
ngx_url_t.uri
: 如果url中uri部分存在的话,解析后存放于此
-
ngx_url_t.host
: 解析后的主机名存放于此
-
ngx_url_t.sockaddr
: 解析后的字符串表示形式
-
ngx_url_t.addrs
: 解析后的地址
9. 函数ngx_parse_inet_url()
本函数用于解析IPv4类型的URL。例如:
localhost:8088/query?id=1001
listen 8000;
下面我们就来简要分析一下该函数:
10. 函数ngx_parse_inet6_url()
本函数用于解析IPv6形式的Url。首先我们给出一个IPv6形式的url的例子:
listen [::1]:12345
下面我们再来简要分析一下本函数:
11. 函数ngx_inet_resolve_host()
本函数用于将主机名解析成url的IP地址。在objs/ngx_auto_config.h头文件中我们有如下定义:
#ifndef NGX_HAVE_GETADDRINFO
#define NGX_HAVE_GETADDRINFO 1
#endif
但是当前并不支持NGX_HAVE_INET6
。下面我们对该函数进行简要说明:
12. 函数ngx_cmp_sockaddr()
此函数用于比较两个socket地址是否相同。函数较为简单,这里不再进行细讲。
//IPv4形式的socket 地址
struct sockaddr_in *sin1, *sin2;
//IPv6形式的socket 地址
struct sockaddr_in6 *sin61, *sin62;
//unix域socket地址
struct sockaddr_un *saun1, *saun2;
[参看]
-
无类域间路由
-
子网掩码