Apache源代码全景分析:网络地址处理
2009-05-13 01:28:01来源:未知 阅读 ()
套接字地址在了解APR中对IP地址的封装之前,我们首先看一下通常情况下对IP地址的使用情况。下面的代码掩饰了简单的服务器端套接字的地址初始化过程:structsockaddr_inserver_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,(structsockaddr*)&my_addr,sizeof(structsockaddr));accept(sockfd,(structsockaddr*)&remote_addr,&sin_size);SocketAPI中提供了三种类型的地址:sockaddr,sockaddr_in和sockaddr_un。sockaddr是通用的套接字结构,sockaddr_in为Internet协议族的地址描述结构,sockaddr_un则是Unix协议组的地址描述结构。sockaddr_in结构中的sa_family决定是sockaddr_in还是sockaddr_un。如果直接使用SocketAPI提供的地址结构,则至少存在下面的几个问题:1、在网络应用程序中,对于internet地址,如上面的程序代码所示,通常总是使用sockaddr_in描述,而在一些SocketAPI函数中则使用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中:structapr_sockaddr_t{apr_pool_t*pool;/*第一部分*/char*hostname;char*servname;/*第二部分*/apr_port_tport;apr_int32_tfamily;union{structsockaddr_insin;#ifAPR_HAVE_IPV6structsockaddr_in6sin6;#endif#ifAPR_HAVE_SA_STORAGEstructsockaddr_storagesas;#endif}sa;/*第三部分*/apr_socklen_tsalen;intipaddr_len;intaddr_str_len;void*ipaddr_ptr;apr_sockaddr_t*next;};
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有