Apache源代码全景分析:网络地址处理

来源: 作者: 2007-08-16 出处:pcdog.com

apache  dns  ipv6  linux  sas  
上一页 1 2 3 4 5 6 7 8 9 10 下一页 

函数的前面几个参数都非常容易理解,只有最后一个参数flag,它用于控制getnameinfo的操作,它允许的值如下面所列:

NI_DGRAM

当知道处理的是数据报套接口的时候,调用者应该设置NI_DGRAM标志,

因为在套接口地址结构中给出的仅仅是IP地址和端口号,getnameinfo无法就此确定所用协议是TCP还是UDP。比如端口514,在TCP端口上提供rsh服务,而在UDP端口上则提供syslog服务。

NI_NOFQDN

该标志导致返回的主机名称被截去第一个点号之后的内容。比如假设套接口结构中的IP地址为912.168.42.2,那么不设置该标志返回的主机名为aix.unpbook.com,那么如果设置了该标志后返回的主机名则为aix。

NI_NUMERICHOST,NI_NUMERICSERV,NI_NUMERICSCOPE

该标志通知getnameinfo不要调用DNS,而是以数值表达格式作为字符串返回IP地址;类似的,NI_NUMERICSERV标志指定以十进制数格式作为字符串返回端口号,以代替查找服务名;NI_NUMERICSCOPE则指定以数值格式作为字符串返回范围标识,以代替其名字

NI_NAMEREQD

该标志通知getnameinfo函数如果无法适用DNS反向解析出主机名,则直接返回一个错误。需要把客户的IP地址映射成主机名的那些服务器可以使用该特性。

如果flag没有指定,即为零,那么NI_NAMEREQD将是Apache中默认的标志项,如果不设置该标志,那么在反向解析失败的时候getnameinfo将返回一个数值地址字符串,显然这并不是Apache所需要的结果。

if (rc != 0) {

*hostname = NULL;

#ifndef WIN32

if (rc == EAI_SYSTEM) {

if (h_errno) { /* for broken implementations which set h_errno */

return h_errno + APR_OS_START_SYSERR;

}

else { /* "normal" case */

return errno + APR_OS_START_SYSERR;

}

}

else

#endif

{

#if defined(NEGATIVE_EAI)

if (rc < 0) rc = -rc;w

#endif

return rc + APR_OS_START_EAIERR; /* return the EAI_ error */

}

}

*hostname = sockaddr->hostname = apr_pstrdup(sockaddr->pool, tmphostname);

return APR_SUCCESS;

上面的代码是对getnameinfo发生错误时候的处理(rc==0意味着成功,否则意味着转换失败)。此时将需要返回的主机名称设置为NULL。当getnameinfo发生错误的时候通常会返回EAI_XXXX的错误码,在所有这些错误码中比较特殊的就是EAI_SYSTEM,它意味着同时在errno变量中有系统错误返回,而其余的EAI_XXXX错误并不会设置errno变量。

对于非EAI_SYSTEM错误码,APR并不能直接返回。正如第一章所说,APR中对于apr_status_t返回码有自己的布局和规则,因此这些错误码必须转换至APR返回码。EAI_XXXX错误码的起始偏移是APR_OS_START_EAIERR,因此返回值实际上是rc+APR_OS_START_EAIERR。不过在一些平台上比如glibc,为了防止和h_errno的值冲突,系统将使用EAI_XXXX的负值, 这正是上面的代码w的原因。

上一页 1 2 3 4 5 6 7 8 9 10 下一页 
上一篇:了解DNS服务器的工作原理及其过程
下一篇:实验:域的安装及客户机加入域