国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關(guān)注微信公眾號(hào)

Apache源代碼全景分析:網(wǎng)絡(luò)地址處理 (3)
2006-06-14   

9.1.3.2主機(jī)名獲取

apr_sockaddr_info_get函數(shù)用以完成從主機(jī)名到網(wǎng)絡(luò)地址的轉(zhuǎn)換,而APR中提供的apr_getnameinfo則可以實(shí)現(xiàn)從網(wǎng)絡(luò)地址到主機(jī)名的轉(zhuǎn)換,該函數(shù)定義如下:

APR_DECLARE(apr_status_t) apr_getnameinfo(char **hostname, apr_sockaddr_t *sa, apr_int32_t flags);

參數(shù)sa指定需要轉(zhuǎn)換的網(wǎng)絡(luò)地址,轉(zhuǎn)換后的主機(jī)名由hostname返回。fags是標(biāo)志位,用以控制內(nèi)部的轉(zhuǎn)換過程。

{

#if defined(HAVE_GETNAMEINFO)

int rc;

#if defined(NI_MAXHOST)

char tmphostname[NI_MAXHOST];

#else

char tmphostname[256];

#endif

SET_H_ERRNO(0);

#if APR_HAVE_IPV6

if (sockaddr->family == AF_INET6 &&

IN6_IS_ADDR_V4MAPPED(&sockaddr->sa.sin6.sin6_addr)) {

struct sockaddr_in tmpsa;

tmpsa.sin_family = AF_INET;

tmpsa.sin_addr.s_addr = ((apr_uint32_t *)sockaddr->ipaddr_ptr)[3];

#ifdef SIN6_LEN

tmpsa.sin_len = sizeof(tmpsa);

#endif

rc = getnameinfo((const struct sockaddr *)&tmpsa, sizeof(tmpsa),

tmphostname, sizeof(tmphostname), NULL, 0,

flags != 0 ? flags : NI_NAMEREQD);

}

else

#endif

#endif

rc = getnameinfo((const struct sockaddr *)&sockaddr->sa, sockaddr->salen,

tmphostname, sizeof(tmphostname), NULL, 0,

flags != 0 ? flags : NI_NAMEREQD);

在函數(shù)的內(nèi)部實(shí)現(xiàn)從地址到主機(jī)名稱的解析是由函數(shù)getnameinfo完成的,該函數(shù)是getaddrinfo的互補(bǔ)函數(shù),它以一個(gè)套接口地址為參數(shù),返回描述其中的主機(jī)的一個(gè)字符串和描述其中的服務(wù)的另一個(gè)字符串。另外該函數(shù)以協(xié)議無(wú)關(guān)的方式提供這些信息,調(diào)用者必須關(guān)心存放在套接口地址結(jié)構(gòu)中的協(xié)議地址的類型,這些由函數(shù)自行處理。

需要轉(zhuǎn)換的地址到底是IPv4還是IPv6,這由地址結(jié)構(gòu)中的family參數(shù)決定。盡管理想中的做法是將apr_getnameinfo()中的參數(shù)直接傳遞給getnameinfo()函數(shù),但是在一些平臺(tái)上還是會(huì)出現(xiàn)一些問題。

MacOS X Panther has a lousy getnameinfo() implementation that doesn't fill the buffer when no DNS entry is found for a host and a numerical result wasn't explicitely asked. As a result, Pure-FTPd didn't even start on Panther (saying "bad IP address") . We now check for EAI_NONAME if available and we retry with NI_NUMERICHOST if this is what getnameinfo() returns. Thanks to Yann Bizeul for his valuable help on this issue. Will research it more and see if I can come up with a patch (I am NOT good at C!)

在一些操作系統(tǒng)中,比如老版本的Mac OS X,如果Ipv6地址是由Ipv4地址映射的結(jié)果,那么該地址在傳遞給getnameinfo函數(shù)的時(shí)候?qū)?huì)產(chǎn)生錯(cuò)誤,這是系統(tǒng)本身實(shí)現(xiàn)的BUG。因此對(duì)于這種情況,解決的方法就是將這種Ipv6地址重新轉(zhuǎn)換為Ipv4地址。Ipv6地址是否是由Ipv4地址進(jìn)行映射而成,通過宏IN6_IS_ADDR_V4MAPPED可以實(shí)現(xiàn)檢測(cè)。IPV4到IPV6地址的映射可以用下圖描述:

Ipv4地址通過在其十六進(jìn)制前面添加前導(dǎo)零的方式映射為IPV6地址。反之如果一個(gè)IPV6地址是由IPV4地址映射而成,則只要剔除前面的前導(dǎo)零即可,剔除后的地址通常為((apr_uint32_t *)sockaddr->ipaddr_ptr)[3];一旦獲取了實(shí)際的IPV4地址,則可以將其傳遞給getnameinfo函數(shù)。

對(duì)于其余的IP地址,包括普通的Ipv4地址,非Ipv4映射的Ipv6地址,由于不存在BUG,因此可以直接調(diào)用getnameinfo。

getnameinfo函數(shù)原型如下:

Int getnameinfo(const struct sockaddr* sockaddr, socklen_t addrlen,

char *host, socklen_t hostlen,

char *serv, socklen_t servlen, int flag);

函數(shù)的前面幾個(gè)參數(shù)都非常容易理解,只有最后一個(gè)參數(shù)flag,它用于控制getnameinfo的操作,它允許的值如下面所列:

NI_DGRAM

當(dāng)知道處理的是數(shù)據(jù)報(bào)套接口的時(shí)候,調(diào)用者應(yīng)該設(shè)置NI_DGRAM標(biāo)志,因?yàn)樵谔捉涌诘刂方Y(jié)構(gòu)中給出的僅僅是IP地址和端口號(hào),getnameinfo無(wú)法就此確定所用協(xié)議是TCP還是UDP。比如端口514,在TCP端口上提供rsh服務(wù),而在UDP端口上則提供syslog服務(wù)。

NI_NOFQDN

該標(biāo)志導(dǎo)致返回的主機(jī)名稱被截去第一個(gè)點(diǎn)號(hào)之后的內(nèi)容。比如假設(shè)套接口結(jié)構(gòu)中的IP地址為912.168.42.2,那么不設(shè)置該標(biāo)志返回的主機(jī)名為aix.unpbook.com,那么如果設(shè)置了該標(biāo)志后返回的主機(jī)名則為aix。

NI_NUMERICHOST,NI_NUMERICSERV,NI_NUMERICSCOPE

該標(biāo)志通知getnameinfo不要調(diào)用DNS,而是以數(shù)值表達(dá)格式作為字符串返回IP地址;類似的,NI_NUMERICSERV標(biāo)志指定以十進(jìn)制數(shù)格式作為字符串返回端口號(hào),以代替查找服務(wù)名;NI_NUMERICSCOPE則指定以數(shù)值格式作為字符串返回范圍標(biāo)識(shí),以代替其名字

NI_NAMEREQD

該標(biāo)志通知getnameinfo函數(shù)如果無(wú)法適用DNS反向解析出主機(jī)名,則直接返回一個(gè)錯(cuò)誤。需要把客戶的IP地址映射成主機(jī)名的那些服務(wù)器可以使用該特性。

如果flag沒有指定,即為零,那么NI_NAMEREQD將是Apache中默認(rèn)的標(biāo)志項(xiàng),如果不設(shè)置該標(biāo)志,那么在反向解析失敗的時(shí)候getnameinfo將返回一個(gè)數(shù)值地址字符串,顯然這并不是Apache所需要的結(jié)果。

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;

上面的代碼是對(duì)getnameinfo發(fā)生錯(cuò)誤時(shí)候的處理(rc==0意味著成功,否則意味著轉(zhuǎn)換失敗)。此時(shí)將需要返回的主機(jī)名稱設(shè)置為NULL。當(dāng)getnameinfo發(fā)生錯(cuò)誤的時(shí)候通常會(huì)返回EAI_XXXX的錯(cuò)誤碼,在所有這些錯(cuò)誤碼中比較特殊的就是EAI_SYSTEM,它意味著同時(shí)在errno變量中有系統(tǒng)錯(cuò)誤返回,而其余的EAI_XXXX錯(cuò)誤并不會(huì)設(shè)置errno變量。

熱詞搜索:

上一篇:Apache源代碼全景分析:網(wǎng)絡(luò)地址處理 (2)
下一篇:Apache源代碼全景分析:網(wǎng)絡(luò)地址處理 (4)

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
欧美v亚洲v综合ⅴ国产v| 制服丝袜中文字幕一区| 国产乱对白刺激视频不卡| 亚洲午夜视频在线| 亚洲一区二区av电影| 亚洲精品欧美在线| 亚洲国产精品欧美一二99| 亚洲地区一二三色| 日本在线播放一区二区三区| 日本视频中文字幕一区二区三区| 亚洲成人免费视| 久久精品国产成人一区二区三区| 国产一区二区三区四| 国产激情视频一区二区在线观看| 成人激情av网| 91久久精品网| 欧美一卡二卡在线观看| 精品免费视频.| 亚洲欧洲无码一区二区三区| 亚洲激情图片qvod| 蜜臀av一区二区| 国产成人免费视频一区| 色综合婷婷久久| 日韩免费观看高清完整版在线观看| 欧美一区二区日韩| 中文字幕精品在线不卡| 亚洲一区二区三区中文字幕 | 精品福利视频一区二区三区| 久久久久久久网| 悠悠色在线精品| 麻豆一区二区99久久久久| 成人精品免费网站| 51精品秘密在线观看| 国产午夜精品理论片a级大结局 | 99国产欧美另类久久久精品| 91日韩一区二区三区| 欧美一区二区三区在线观看| 欧美激情艳妇裸体舞| 一级特黄大欧美久久久| 久久成人精品无人区| 日本韩国精品在线| 国产性天天综合网| 日本不卡视频在线| 色综合天天综合网天天狠天天| 日韩精品资源二区在线| 亚洲女同一区二区| 国产精品66部| 69堂国产成人免费视频| 依依成人精品视频| 国产成a人无v码亚洲福利| 3atv一区二区三区| 亚洲网友自拍偷拍| 91视频免费看| 中文字幕一区二区三区在线观看| 久久99久久久久| 91精品国产综合久久婷婷香蕉| 亚洲精品第一国产综合野| 国产成人av在线影院| 精品国产一二三| 美女在线一区二区| 欧美久久久一区| 亚洲韩国精品一区| 欧美综合视频在线观看| 怡红院av一区二区三区| www.久久精品| 亚洲人亚洲人成电影网站色| 国产成人亚洲综合a∨婷婷| 欧美哺乳videos| 另类欧美日韩国产在线| 日韩免费看网站| 国内精品免费在线观看| 欧美电影免费观看高清完整版在| 日韩av二区在线播放| 666欧美在线视频| 老司机免费视频一区二区| 欧美一级一区二区| 久久国产精品免费| 久久青草欧美一区二区三区| 国产一区 二区 三区一级| 久久婷婷成人综合色| 国产伦精品一区二区三区在线观看| 精品国产制服丝袜高跟| 国产精品自拍在线| 国产精品二三区| 91成人免费在线| 午夜激情综合网| 日韩精品一区二区三区视频在线观看 | 中文字幕在线不卡| 色综合视频一区二区三区高清| 亚洲欧洲成人精品av97| 91高清视频在线| 青青草国产精品亚洲专区无| 久久亚洲一区二区三区明星换脸 | 国精品**一区二区三区在线蜜桃| 久久综合丝袜日本网| 成人午夜视频福利| 亚洲午夜免费视频| 精品久久久三级丝袜| 成人妖精视频yjsp地址| 亚洲精品日韩专区silk| 欧美一级高清片在线观看| 国产东北露脸精品视频| 一区二区三区不卡视频| 日韩一区二区三区观看| 国产成人午夜高潮毛片| 亚洲专区一二三| 日本一区二区视频在线| 欧美日韩激情一区二区三区| 国模一区二区三区白浆| 一区二区三区在线视频观看| 日韩欧美的一区| 色诱亚洲精品久久久久久| 精品在线观看免费| 亚洲欧美另类综合偷拍| 日韩女优电影在线观看| 91猫先生在线| 国产在线精品免费| 一区二区在线免费观看| 久久久久久久久一| 欧美日韩色综合| 91视频一区二区| 国产精品一卡二卡在线观看| 亚洲一二三四区不卡| 欧美国产一区在线| 欧美成人vr18sexvr| 欧美精品一二三四| 91无套直看片红桃| 成人国产电影网| 国产精品自拍在线| 美国一区二区三区在线播放| 亚洲制服丝袜av| 亚洲免费视频中文字幕| 欧美高清在线一区| 久久婷婷国产综合国色天香 | 成人性生交大片免费| 精彩视频一区二区| 日韩专区在线视频| 亚洲自拍偷拍综合| 亚洲欧美综合在线精品| 日本一区二区成人| 国产欧美中文在线| 精品成人一区二区三区四区| 在线观看91av| 91精品中文字幕一区二区三区| 欧美视频在线观看一区| 91蜜桃免费观看视频| www.成人在线| 色综合久久中文字幕| 99精品久久久久久| 91毛片在线观看| 色狠狠av一区二区三区| 91官网在线免费观看| 日本久久一区二区三区| 在线观看日韩精品| 欧美午夜在线观看| 7777精品久久久大香线蕉| 欧美精品一卡两卡| 精品国产一区二区亚洲人成毛片| 精品国产乱码久久久久久图片| 日韩欧美成人激情| 久久综合狠狠综合久久激情| 久久夜色精品国产噜噜av| 国产日韩在线不卡| 国产精品每日更新| 亚洲欧美福利一区二区| 亚洲自拍欧美精品| 免费的成人av| 国产福利不卡视频| 91蝌蚪porny九色| 欧美男人的天堂一二区| 欧美精品v国产精品v日韩精品| 精品三级在线观看| 中文字幕va一区二区三区| 一区二区三区日韩在线观看| 日韩在线一区二区三区| 国产精品伊人色| 91九色02白丝porn| 日韩视频在线永久播放| 国产视频一区在线观看| 亚洲愉拍自拍另类高清精品| 老汉av免费一区二区三区| 国产91露脸合集magnet| 欧美在线视频不卡| 久久九九99视频| 天堂在线一区二区| 国产麻豆精品一区二区| 色乱码一区二区三区88| 欧美zozozo| 亚洲日本免费电影| 国产伦精品一区二区三区在线观看| 91猫先生在线| 久久综合九色综合97婷婷女人| 亚洲激情五月婷婷| 国产激情精品久久久第一区二区| 欧洲激情一区二区| 亚洲国产精品ⅴa在线观看| 午夜视频在线观看一区二区三区| 国产精品99久久久久久久女警| 日韩欧美你懂的| 亚洲美女免费在线|