UDP协议下:单一socket复用 IPV4与IPV6地址

本文介绍了如何在UDP协议下,通过单一socket复用IPV4与IPV6地址。服务器端通过设置`AI_PASSIVE`、`AF_INET6`等选项实现地址复用,客户端同样使用`AF_INET6`初始化套接字。通过`getaddrinfo()`函数获取地址信息,并使用`bind()`函数绑定。服务器和客户端通过`recvfrom()`和`sendto()`进行数据交互。
摘要由CSDN通过智能技术生成

最近学习套接字编程,简单的总结了一下IPV4与IPV6地址复用的工作。

UDP协议下:单一socket复用 IPV4IPV6地址

1服务器端

通常情况下,对于一个简单的UDP服务器,其工作流程如下:

1.1初始化套接字:

Socketfd = socketint domainint typeint protocol

对于希望复用ipv4ipv6地址的服务器来说,比较好的做法是将domain参数定义为AF_INET6

1.2获取服务器地址信息:

获取与socket关联的地址,复用IPV4以及IPV6的套接字,应该调用下面函数进行地址信息的获取:

getaddrinfochar * hostchar * serverstruct addrinfo * hintstruct addrinfo ** result

该函数将返回一个 struct addrinfo * 结构体指针链表,其表头地址储存于 struct addrinfo ** result 中。

下面简单介绍一下linuxstruct 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值