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

掃一掃
關注微信公眾號

Apache源代碼全景分析:網絡地址處理 (4)
2006-06-14   

對于非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的原因。

上面的代碼有一個假設前提,就是系統中必須提供getnameinfo()函數。但是由于getnameinfo()是比較新的一個函數,并不是每個操作系統平臺都支持該函數。目前大部分Ipv4平臺上不過都提供了gethostbyaddr()函數,通過該函數也能完成從主機地址到主機名稱的轉換,不過該函數僅僅支持Ipv4協議,不支持Ipv6協議。具體的代碼如下所示:

#else

#if APR_HAS_THREADS && !defined(GETHOSTBYADDR_IS_THREAD_SAFE) &&

defined(HAVE_GETHOSTBYADDR_R) && !defined(BEOS)

#ifdef GETHOSTBYNAME_R_HOSTENT_DATA

struct hostent_data hd;

#else

char tmp[GETHOSTBYNAME_BUFLEN];

#endif

int hosterror;

struct hostent hs, *hptr;

#if defined(GETHOSTBYNAME_R_HOSTENT_DATA)

/* AIX, HP/UX, D/UX et alia */

gethostbyaddr_r((char *)&sockaddr->sa.sin.sin_addr, u

sizeof(struct in_addr), AF_INET, &hs, &hd);

hptr = &hs;

#else

#if defined(GETHOSTBYNAME_R_GLIBC2)

/* Linux glibc2+ */

gethostbyaddr_r((char *)&sockaddr->sa.sin.sin_addr, v

sizeof(struct in_addr), AF_INET,

&hs, tmp, GETHOSTBYNAME_BUFLEN - 1, &hptr, &hosterror);

#else

/* Solaris, Irix et alia */

hptr = gethostbyaddr_r((char *)&sockaddr->sa.sin.sin_addr, w

sizeof(struct in_addr), AF_INET,

&hs, tmp, GETHOSTBYNAME_BUFLEN, &hosterror);

#endif /* !defined(GETHOSTBYNAME_R_GLIBC2) */

if (!hptr) {

*hostname = NULL;

return hosterror + APR_OS_START_SYSERR;

}

#endif /* !defined(GETHOSTBYNAME_R_HOSTENT_DATA) */

#else

struct hostent *hptr;

hptr = gethostbyaddr((char *)&sockaddr->sa.sin.sin_addr, x

sizeof(struct in_addr), AF_INET);

#endif

if (hptr) {

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

return APR_SUCCESS;

}

*hostname = NULL;

#if defined(WIN32)

return apr_get_netos_error();

#elif defined(OS2)

return h_errno;

#else

return h_errno + APR_OS_START_SYSERR;

#endif

#endif

函數中眾多的預定義讓人眼花繚亂。不過最主要的預定義處理還在于對gethostbyaddr()函數的調用。從上面的代碼中可以看出,gethostbyaddr有一個函數變形gethostbyaddr_r,而且不同平臺下的gethostbyaddr_t函數的參數也不相同,要了解詳細的原因,必須了解一些函數可重入的概念。

所謂可重入函數是指一個可以被多個任務調用的函數,任務在調用時候不必擔心數據會出錯;通常情況下下面的函數是不可重入的:

(1)、函數體內使用了靜態的數據結構;

(2)、函數體內調用了malloc()或者free()函數;

(3)、函數體內調用了標準I/O函數。

通常情況下,在一個UNIX進程中發生重入問題的條件是:從主程序中和某個信號處理函數中同時調用某個不可重入函數.。另外在多線程應用中也會出現函數重入的問題。不幸的是由于歷史的原因,我們經常使用的gethostbyaddr也是一個不可重入的函數,因為它們都返回指向同一個靜態結構的指針。關于gethostbyaddr的重入問題,《Unix網絡編程 第一卷:套接口API》中文版第二版的第207頁中有一段描述,摘抄如下:

不幸的是,重入問題比他表面看起來更要嚴重。首先,關于gethostbyname和gethostbyaddr的重入問題無標準可循。POSIX規范聲明這兩個函數不必是可重入的。Unix98只說這兩個函數必須是線程安全的。

其次,關于_r函數也沒有標準可循。Solaris 2.X,Digital Unix 4.0和HP-UX 10.30都提供了可重入版本的gethostbyaddr_r函數,不過它們的參數并不相同,不同版本的gethostbyaddr_r函數原型如下表所示:

操作系統平臺 函數原型

solaris struct hostent* gethostbyaddr_r(const char *addr, int len, int type,

struct hostent *result, char *buf, int buflen, int * h_errnop);

AIX,HP-UX,Digital Unix int gethostbyaddr_r(const char *addr, int len, int type, struct hostent *result,

struct hostent_data *buffer);

Linux glibc2+ int gethostbyaddr_r(const char *addr,int len, int type,struct hostent *result,

char* buf, int buflen, struct hostent *hs, int* h_errnop);

大部分gethostbyaddr_r函數的前四個參數都相同,第一個是需要轉換的地址;第二個地址的字節大小,用sizeof(struct in_addr)表示;第三個是需要轉換地址的協議族,或者是AF_INET,或者是AF_INET6;第四個則是描述主機的hostent結構。區別通常在后幾個參數:

對于Solaris,Irix等操作系統而言,后面還需要三個額外的參數,buf是由調用者分配的并且大小為buflen的緩沖區,該緩沖區用于存放規范主機名稱,別名指針數組,各個別名字符串,地址指針數組以及各個實際地址。如果初出錯,錯誤碼通過h_errnop指針返回,注意不是我們通常所說的h_errno返回。

對于AIX,HP-UX,Digital Unix等平臺而言,后面的三個參數則被組合為一個新的數據結構hostent_data,指向該結構的指針構成本函數的第三個和最后一個參數。Apache中默認的緩沖區大小為GETHOSTBYNAME_BUFLEN,即512字節。

對于Linux glibc2+而言,gethostbyaddr_r的參數與前兩者又存在一定的差異,它共計有八個參數,與Solaris平臺相比多了struct hostent* hs參數。

如果操作系統平臺不支持可重入的gethostaddr_r函數,那么只能使用不可重入的gethostbyaddr函數,如x所示。

返回的主機名稱保存在hostent結構中,如果查詢成功,從hostname參數中返回即可。

9.1.3.3 IP地址解析

APR_DECLARE(apr_status_t) apr_parse_addr_port(char **addr,

char **scope_id,

apr_port_t *port,

const char *str,

apr_pool_t *p);

熱詞搜索:

上一篇:Apache源代碼全景分析:網絡地址處理 (3)
下一篇:排除使用路由器后無法使用VPN的故障

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
一本色道久久综合精品竹菊| 亚洲一区二区三区不卡国产欧美| 欧洲精品中文字幕| av电影天堂一区二区在线观看| 精品一区二区三区在线观看国产| 免费观看在线综合| 激情图片小说一区| 国产成人福利片| 国产成人久久精品77777最新版本| 国精产品一区一区三区mba视频| 蜜臀av国产精品久久久久| 三级一区在线视频先锋| 日韩精品每日更新| 麻豆国产一区二区| 国产成人精品午夜视频免费| 高清日韩电视剧大全免费| 成人黄色一级视频| 在线视频中文字幕一区二区| 欧美精品高清视频| 久久精品一区二区| 一区二区成人在线| 美女在线一区二区| 成人高清视频在线| 欧美日韩一区二区在线观看视频 | 99久久99久久综合| 色哟哟日韩精品| 欧美一区二区性放荡片| 久久精品人人做| 亚洲愉拍自拍另类高清精品| 免费成人在线网站| 91视频在线看| 欧美成人一区二区三区在线观看| 国产清纯美女被跳蛋高潮一区二区久久w| 国产精品成人午夜| 蜜臀久久久久久久| 色综合久久66| 久久久精品人体av艺术| 亚洲国产成人91porn| 久久99久久精品| 91久久香蕉国产日韩欧美9色| 欧美videos大乳护士334| 亚洲人午夜精品天堂一二香蕉| 婷婷中文字幕一区三区| kk眼镜猥琐国模调教系列一区二区| 欧美亚洲动漫制服丝袜| 久久久久国产精品人| 三级亚洲高清视频| 色综合久久中文综合久久97| 久久久精品2019中文字幕之3| 亚洲自拍偷拍综合| 97久久超碰精品国产| 久久久www免费人成精品| 五月天欧美精品| 欧美中文字幕久久| 亚洲精品五月天| 成人精品一区二区三区中文字幕| 日韩欧美一区二区不卡| 亚洲第一电影网| 91丨九色丨蝌蚪丨老版| 中文字幕第一区| 国产福利一区在线| 精品国偷自产国产一区| 日韩激情一区二区| 欧美亚洲综合色| 亚洲一区二区三区四区五区中文 | 亚洲欧美韩国综合色| 成人精品在线视频观看| 欧美成人精品1314www| 91丨porny丨国产入口| 日韩一区二区三| 琪琪久久久久日韩精品| 欧美日韩mp4| 亚洲一区二区三区免费视频| 色一区在线观看| 一区二区三区资源| 欧美午夜视频网站| 午夜欧美视频在线观看| 欧美日韩国产片| 日本视频一区二区三区| 911精品国产一区二区在线| 天天影视网天天综合色在线播放| 欧洲av一区二区嗯嗯嗯啊| 亚洲精品一二三区| 欧美性xxxxxxxx| 日韩精品电影在线观看| 欧美一级高清片| 久久99深爱久久99精品| 欧美精品一区二区三区高清aⅴ | 51精品久久久久久久蜜臀| 亚洲高清免费在线| 日韩午夜激情电影| 国产精品中文有码| 国产精品福利一区二区三区| 99精品国产热久久91蜜凸| 亚洲免费观看高清| 欧美色窝79yyyycom| 久久精工是国产品牌吗| 国产午夜精品在线观看| 91原创在线视频| 婷婷六月综合网| eeuss鲁片一区二区三区在线看| 欧美一级日韩一级| 日韩一区二区三区在线视频| 久久精品国产精品亚洲精品| 日本一区二区三区在线观看| 色一情一伦一子一伦一区| 日本三级亚洲精品| 久久免费精品国产久精品久久久久| 国产69精品久久久久毛片| 亚洲一区二区三区三| 久久青草欧美一区二区三区| 在线视频你懂得一区二区三区| 美女视频一区二区| 亚洲欧洲制服丝袜| 欧美xxxxx牲另类人与| 一本久久综合亚洲鲁鲁五月天 | 蜜臀av一区二区| 国产精品福利一区二区| 欧美一区二区在线看| 成人听书哪个软件好| 免费av网站大全久久| 亚洲欧美激情一区二区| 久久一区二区视频| 欧美日韩在线播放一区| 99国产精品久久久久| 国产一区二区看久久| 亚洲成人自拍网| 国产精品福利一区二区| 久久午夜色播影院免费高清 | 老色鬼精品视频在线观看播放| 国产精品久久久久一区二区三区共| 欧美日韩国产综合久久| 91在线你懂得| 成人福利视频在线看| 国产一区二区不卡| 日韩成人一区二区| 亚洲国产精品欧美一二99| 日韩毛片一二三区| 国产精品三级视频| 久久免费精品国产久精品久久久久| 51午夜精品国产| 欧美日本视频在线| 欧美色综合天天久久综合精品| www.欧美日韩| 色94色欧美sute亚洲13| 不卡视频一二三| 成人91在线观看| caoporm超碰国产精品| 国产夫妻精品视频| 国产在线不卡一区| 国产一区二区三区四区五区入口| 九一久久久久久| 韩国视频一区二区| 久久99国产精品麻豆| 久久精品二区亚洲w码| 久久精品国产在热久久| 精品在线一区二区| 国产高清亚洲一区| 91网上在线视频| 欧美性生活一区| 9191国产精品| 久久久.com| 亚洲精选免费视频| 日日夜夜免费精品视频| 男女视频一区二区| 国产自产视频一区二区三区| 国产精品一色哟哟哟| 99在线精品观看| 欧美美女一区二区在线观看| 51午夜精品国产| 欧美国产日韩a欧美在线观看| 成人欧美一区二区三区1314| 亚洲免费资源在线播放| 日韩不卡一区二区三区| 国产福利一区二区| 色拍拍在线精品视频8848| 欧美日韩国产一二三| 欧美精品一区二区三区蜜桃视频| 中文字幕一区二区日韩精品绯色| 亚洲品质自拍视频| 青青草精品视频| 成人免费高清在线观看| 欧美人狂配大交3d怪物一区| 精品免费国产二区三区| 亚洲欧洲精品成人久久奇米网| 亚洲大尺度视频在线观看| 国产一区二区三区日韩| 91久久精品日日躁夜夜躁欧美| 日韩精品中午字幕| 亚洲精品乱码久久久久| 国产乱色国产精品免费视频| 日本福利一区二区| 国产午夜亚洲精品不卡| 偷拍自拍另类欧美| 波多野结衣亚洲一区| 欧美一区二区在线观看| 亚洲女同一区二区| 国产一区二区影院| 337p亚洲精品色噜噜| 亚洲乱码国产乱码精品精小说|