有什么办法可以在绑定后更改套接字的族? (与IPv6相关的问题)

时间:2010-10-25 17:48:34

标签: networking posix

我正在尝试改进API以与IPv4兼容。基本上,API在一个阶段创建一个套接字,然后调用bind()来打开一个端口进行监听。通过传递getaddrinfo()返回的sockaddr来指定端口,并在service参数中指定端口。稍后,调用者可以选择分配组播组,调用API函数在套接字上设置IP_ADD_MEMBERSHIP。

问题在于IPv6(即getaddrinfo的系列提示是AF_UNSPEC而不是之前的AF_INET),当用户请求IPv4多播组时,IP_ADD_MEMBERSHIP失败。这是因为当没有提供提示时,系统显然默认提供IPv6地址。

显然,解决方案是提前知道用户是否要指定IPv4或IPv6多播组。但是,由于我试图不改变API本身,因此这些信息被认为是未知的。

我还有其他选择吗?

我尝试在IP_ADD_MEMBERSHIP之前关闭,重新创建和重新绑定套接字但我的第二个bind()由于某种原因失败了。 (我尝试指定SO_REUSEADDR,但这没有帮助。)

有没有办法简单地“取消绑定”套接字并将其重新绑定到新的家庭?或者只是改变家庭,期间?

1 个答案:

答案 0 :(得分:1)

不可能。通常的kludgey解决方案是保留两个套接字,一个用于AF_INET,一个用于AF_INET6