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

掃一掃
關注微信公眾號

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

在了解APR中對IP地址的封裝之前,我們首先看一下通常情況下對IP地址的使用情況。下面的代碼掩飾了簡單的服務器端套接字的地址初始化過程:

struct sockaddr_in server_addr; /* 本機地址信息 */

server_addr.sin_family=AF_INET;

server_addr.sin_port=htons(SERVPORT);

server_addr.sin_addr.s_addr = INADDR_ANY;

bzero(&(server_addr.sin_zero),8);

……

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

  accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size);

Socket API中提供了三種類型的地址:sockaddr,sockaddr_in和sockaddr_un。sockaddr是通用的套接字結構,sockaddr_in為Internet協議族的地址描述結構,sockaddr_un則是Unix協議組的地址描述結構。sockaddr_in結構中的sa_family決定是sockaddr_in還是sockaddr_un。

如果直接使用Socket API提供的地址結構,則至少存在下面的幾個問題:

1、在網絡應用程序中,對于internet地址,如上面的程序代碼所示,通常總是使用sockaddr_in描述,而在一些Socket API函數中則使用sockaddr作為套接字地址,因此在使用的時候必須將sockaddr_in強制轉換為sockaddr類型,這是一個麻煩而且容易出錯的地方。

2、sockaddr_in也不是一個特別容易理解的數據結構。通常情況下,sin_family和sin_port相對容易記憶,而套接字地址sin_addr.s_addr則未必。套接字的這種結構對一般人而言無疑是一種噩夢。

3、另外一個問題則是Ipv6的地址問題。目前,Apache已經開始同時支持Ipv4和Ipv6兩種類型的地址,如果用戶需要支持Ipv6,則還必須使用Ipv6對應的地址數據結構。

對于一個良好的類庫,不管是Ipv4還是Ipv6協議,都必須提供同樣的接口,這種接口必須簡單易懂,同時必須盡可能的隱藏內部的細節,比如對于sin_addr.s_addr無非暴露給用戶。

基于上面的分析,APR中只使用一種數據結構apr_sockaddr_t來描述IP地址,該結構定義在文件apr_network_io.h中:

struct apr_sockaddr_t {

apr_pool_t *pool;

/*第一部分*/

char *hostname;

char *servname;

/*第二部分*/

apr_port_t port;

apr_int32_t family;

union {

struct sockaddr_in sin;

#if APR_HAVE_IPV6

struct sockaddr_in6 sin6;

#endif

#if APR_HAVE_SA_STORAGE

struct sockaddr_storage sas;

#endif

} sa;

/*第三部分*/

apr_socklen_t salen;

int ipaddr_len;

int addr_str_len;

void *ipaddr_ptr;

apr_sockaddr_t *next;

};

該結構描述了socket地址的三部分的信息內容:

第一部分:

Hostname是該地址對應的主機名稱,而servname則是對應端口的服務名稱,比如80對應的名稱為”www”,21端口對應的servname則是”FTP”。如果某個端口比如9889并沒有對應某個眾所皆知的服務,那么servname則直接是端口的字符串描述。

第二部分:

該部分則對應的是sockaddr結構中的內容,port是端口,family則是地址協議族類型,包括AF_INET,AF_UNIX等。sa則為聯合類型,用以描述對應的套接字地址,或者是Ipv4類型,或者是Ipv6類型,兩者只能居其一。

第三部分:

這部分主要是一些與套接字地址相關的附加信息。Salen是當前套接字地址的長度,通常情況下它的值為sizeof(struct sockaddr_in),對于IPV6,則是sizeof(struct sockaddr_in6);ipiaddr_len則是對應得IP地址結構的長度,對于Ipv4總是sizeof(struct in_addr),而對于Ipv6,則是sizeof(struct in6_addr);addr_str_len則是IP地址緩沖的長度,對于Ipv4,該值為14,而對于IPV6,則是46。這三個地址的含義完全不同。

Ipaddr_ptr指針指向sockaddr結構中的IP地址結構,通常情況下,它的初始化使用下面的代碼:

apr_socketaddr_t addr;

addr->ipaddr_ptr = &(addr->sa.sin.sin_addr);

對于一些服務器而言,可能會使用多個IP地址。這些IP地址之間通過next指針形成單鏈表結構。

從next可以看出各個socket地址之間可以形成鏈表。

9.1.2子網掩碼結構

與此同時,APR中也定義了數據結構apr_ipsubnet_t來描述IP地址掩碼,當然由于IP地址分為Ipv4和Ipv6,因此掩碼描述也可以分為兩種,apr_ipsubnet_t結構定義在文件apr_sockaddr.c中,屬于內部數據結構,具體如下:

struct apr_ipsubnet_t {

int family;

#if APR_HAVE_IPV6

apr_uint32_t sub[4]; /* big enough for IPv4 and IPv6 addresses */

apr_uint32_t mask[4];

#else

apr_uint32_t sub[1];

apr_uint32_t mask[1];

#endif

};

family是當前掩碼所屬于的地址族,APR_INET表示Ipv4,而APR_INET6則表示Ipv6。

對于Ipv4而言,該結構演變為如下:

struct apr_ipsubnet_t {

int family;

apr_uint32_t sub[1];

apr_uint32_t mask[1];

};

而對于Ipv6,則該結構可以演變為如下:

struct apr_ipsubnet_t {

int family;

apr_uint32_t sub[4]; /* big enough for IPv4 and IPv6 addresses */

apr_uint32_t mask[4];

};

9.1.3 Socket地址處理接口

為了處理Socket地址,APR中提供了四個操作接口,這些接口定義在apr_network_io.h中,而實現則sockaddr.c中。這四個接口分別是:

9.1.3.1地址獲取

由于APR中僅僅使用apr_sockaddr_t結構描述套接字地址,因此其余的各類描述信息最終都要轉換為該結構,APR中提供apr_sockaddr_info_get函數實現該功能:

APR_DECLARE(apr_status_t) apr_sockaddr_info_get(apr_sockaddr_t **sa,

const char *hostname,

apr_int32_t family,

apr_port_t port,

apr_int32_t flags,

apr_pool_t *p);

該函數允許從主機名hostname,地址協議族family和端口port創建新的apr_sockaddr_t地址,并由sa返回。

hostname參數允許是實際的主機名稱,或者也可以是字符串類型的IP地址,比如”127.0.0.1”,甚至可以是NULL,此時默認的地址是”0.0.0.0”。

family的值可以是AF_INET,AF_UNIX等系統定義類型,也可以是APR_UNSPEC類型,此時,地址協議族由系統決定。

flags參數用以指定Ipv4和Ipv6處理的 優先級,它的取值包括兩種:APR_IPV4_ADDR_OK和APR_IPV6_ADDR_OK。這兩個標志并不是在所有的情況下都有效,這可以從函數的實現中看出它的用法:

{

apr_int32_t masked;

*sa = NULL;

if ((masked = flags & (APR_IPV4_ADDR_OK | APR_IPV6_ADDR_OK))) {

if (!hostname ||

family != APR_UNSPEC ||

masked == (APR_IPV4_ADDR_OK | APR_IPV6_ADDR_OK)) {

return APR_EINVAL;u

}

#if !APR_HAVE_IPV6

if (flags & APR_IPV6_ADDR_OK) {

return APR_ENOTIMPL;

}

#endif

}

#if !APR_HAVE_IPV6

if (family == APR_UNSPEC) {

family = APR_INET; v

}

#endif

return find_addresses(sa, hostname, family, port, flags, p); w

}

熱詞搜索:

上一篇:Linux用戶也能玩轉Google Earth了
下一篇:Apache源代碼全景分析:網絡地址處理 (2)

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
欧美美女一区二区三区| 亚洲久本草在线中文字幕| 99国产精品久久久久| 欧美成人三级在线| 91精品福利视频| 91精品国产综合久久蜜臀| 日韩一区和二区| 欧美一级艳片视频免费观看| 日韩欧美一级片| 午夜精品视频一区| 色成年激情久久综合| 中文字幕一区二区三区四区不卡| 久久丁香综合五月国产三级网站| 欧美日韩一区二区三区免费看| 欧美日韩国产一区| 国产精品天干天干在观线| 国产精品69毛片高清亚洲| 日韩欧美aaaaaa| 国产福利一区二区三区| 国产视频一区二区在线观看| 国产麻豆视频精品| 久久久久国色av免费看影院| 美洲天堂一区二卡三卡四卡视频| 欧洲一区在线观看| 亚洲免费观看高清完整版在线 | 3atv在线一区二区三区| 日韩欧美成人一区二区| 亚洲图片激情小说| 国产一区二区三区国产| 欧美男人的天堂一二区| 国产精品国产三级国产a| 不卡一区二区在线| 日韩av网站免费在线| 中文字幕一区二区三区四区不卡| 色偷偷88欧美精品久久久| 欧美一区二视频| 依依成人综合视频| 成人激情小说乱人伦| 欧美精品一区二区蜜臀亚洲| 亚洲一区二区三区在线播放| 成人一区二区三区视频在线观看 | 成人av免费在线观看| 在线成人av网站| 一区二区欧美精品| 欧美电影免费观看完整版| 国产精品网站在线| 色88888久久久久久影院按摩| |精品福利一区二区三区| 欧美亚洲尤物久久| 蜜臀91精品一区二区三区| 久久久不卡影院| 欧美日韩亚洲综合在线| 九九国产精品视频| 欧美国产国产综合| 欧美在线观看一区| 精品一区二区在线免费观看| 国产精品免费av| 欧美亚洲动漫另类| 懂色av一区二区三区免费观看 | 国产精品亚洲综合一区在线观看| 欧美激情综合网| 激情综合色播激情啊| fc2成人免费人成在线观看播放 | 成人aa视频在线观看| 国产精品亚洲а∨天堂免在线| 久久国产精品区| 国内精品久久久久影院色| 日韩精品一区二| 成人免费毛片aaaaa**| 国产在线播放一区二区三区| 亚洲国产精品人人做人人爽| 久久久久久久久蜜桃| 26uuu久久天堂性欧美| 欧美高清hd18日本| 欧美日韩国产区一| 欧美男生操女生| 日韩午夜三级在线| 91精品国产手机| 日韩你懂的在线观看| 精品少妇一区二区三区日产乱码 | 日日噜噜夜夜狠狠视频欧美人| 亚洲激情在线激情| 一区二区在线免费观看| 亚洲成人先锋电影| 美女视频网站久久| 精品一区二区在线观看| 国产美女精品在线| kk眼镜猥琐国模调教系列一区二区 | 五月婷婷久久丁香| 国产一区二区三区四| 欧美性猛片aaaaaaa做受| 国产精品三级电影| 久久精品国产亚洲高清剧情介绍| 91免费版在线| 国产精品三级电影| 国产99久久久久| 国产女主播一区| 国产一区不卡精品| 精品免费一区二区三区| 天天色天天操综合| 欧美午夜精品一区二区蜜桃| 日韩理论片网站| 在线观看亚洲一区| 亚洲高清视频在线| 欧美亚洲动漫制服丝袜| 亚洲成人1区2区| 欧美精品一二三区| 亚洲一区二区在线视频| 欧美精品xxxxbbbb| 蜜桃久久av一区| 精品国产91乱码一区二区三区| 欧美a级一区二区| 精品sm捆绑视频| 99久久免费视频.com| 一区二区三区在线观看欧美| 在线亚洲一区二区| 欧美成人猛片aaaaaaa| 三级影片在线观看欧美日韩一区二区 | 国产一区二区调教| 精品国产乱码久久久久久蜜臀 | 激情综合亚洲精品| 国产欧美精品一区| 从欧美一区二区三区| 国产精品久久久久一区| 色综合天天天天做夜夜夜夜做| 亚洲欧洲日产国产综合网| 99在线精品观看| 亚洲自拍都市欧美小说| 51精品久久久久久久蜜臀| 日韩影院免费视频| 日韩无一区二区| 日本黄色一区二区| 国产精品国产三级国产aⅴ原创 | 成人黄色777网| 日本午夜精品视频在线观看 | 亚洲电影视频在线| 欧美三级电影网| 国产情人综合久久777777| 国精品**一区二区三区在线蜜桃| 国产91精品免费| 伊人开心综合网| 欧美日韩国产一级片| 久久国产剧场电影| 国产精品麻豆99久久久久久| hitomi一区二区三区精品| 五月天网站亚洲| 欧美国产精品久久| 欧美午夜视频网站| 国产成人8x视频一区二区| 亚洲综合色噜噜狠狠| 2023国产一二三区日本精品2022| 国产69精品久久99不卡| 午夜精品福利视频网站| 2020国产成人综合网| 日韩高清在线一区| 久久精品视频网| 日韩一区二区在线观看视频播放| 成人蜜臀av电影| 青草av.久久免费一区| 玉足女爽爽91| 亚洲精品在线观看网站| 在线成人小视频| 在线视频国内一区二区| 成人免费视频播放| 国产综合色在线| 激情久久五月天| 天天综合日日夜夜精品| 亚洲人一二三区| 一区二区在线观看不卡| 国产精品色婷婷| 国产欧美日韩麻豆91| 国产亚洲精品久| 精品国产乱码久久久久久老虎 | 午夜av电影一区| 亚洲www啪成人一区二区麻豆| 亚洲欧美电影一区二区| 国产精品久久久久久一区二区三区| 欧美xxxxxxxx| 国产亚洲欧美激情| 久久精品欧美日韩| 国产女主播在线一区二区| 国产精品久久久久久久裸模| 国产精品二区一区二区aⅴ污介绍| 国产欧美一区二区精品性色 | 国产精品18久久久久久久久 | 欧美日韩高清不卡| 欧美一区二区不卡视频| 欧美大片在线观看| 久久婷婷国产综合精品青草| 中文字幕精品在线不卡| 久久精品免视看| 五月天一区二区三区| 久久国产麻豆精品| 波多野结衣中文字幕一区| 色噜噜狠狠成人中文综合| 欧美一区二区美女| 国产欧美日韩精品a在线观看| 亚洲一线二线三线视频| 国产精品99久久不卡二区| 欧洲视频一区二区|