最近学习套接字编程,简单的总结了一下IPV4与IPV6地址复用的工作。
UDP协议下:单一socket复用 IPV4与IPV6地址
1服务器端
通常情况下,对于一个简单的UDP服务器,其工作流程如下:
1.1初始化套接字:
Socketfd = socket(int domain,int type,int protocol)
对于希望复用ipv4与ipv6地址的服务器来说,比较好的做法是将domain参数定义为AF_INET6。
1.2获取服务器地址信息:
获取与socket关联的地址,复用IPV4以及IPV6的套接字,应该调用下面函数进行地址信息的获取:
getaddrinfo(char * host,char * server,struct addrinfo * hint,struct addrinfo ** result)
该函数将返回一个 struct addrinfo * 结构体指针链表,其表头地址储存于 struct addrinfo ** result 中。
下面简单介绍一下linux中struct addrinfo的实现
Struct addrinfo
{
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_len ai_addrlen;
struct sockaddr * ai_addr;
char *ai_canonname;
struct addrinfo * ai_next;
}
该结构体各成员具体含义稍后介绍。
再来观察getaddrinfo()函数,其中参数 struct addrinfo * hint可以理解为一个用于过滤返回内容的参数。只有与hint属性匹配的addrinfo *才回被添加到返回的链表中。
回头来介绍一下struct addrinfo中各成员的含义,以及在调用getaddrinfo()函数时,hint中可以被赋值从而用于过滤的成员。
1.2.1 ai_flag选项
可以是零个或多个在一起的AI_XXX值,具体如下:
AI_PASSIVE 套接字将用于被动打开(或监听绑定),通常配置于server端。
AI_CANONNAME 告知getaddrinfo()函数返回主机的规范名字。
AI_ADDRCONFIG 按照所在主机的配置选择返回地址类型。也就是说返回除本机回馈接口以外的网络接口配置的IP地址版本一致的IP地址。
1.2.2 ai_family 选项
AF_INET 指定返回IPV4地址信息;
AF_INET6 指定返回IPV6地址信息;
AF_UNSPEC 未指定返回IP地址版本,也就是说符合hint过滤条件的所有地址信息都将返回。
1.2.3 ai_socktype 选项
SOCK_DGRAM 简单理解为UDP
SOCK_STREAM 简单理解为TCP
1.2.4 ai_protocol 选项
该选项通常可由ai_family以及ai_socktype共同确定。
以上4个成员为getaddrinfo