我正在尝试改造一个与IPv4兼容的应用程序接口。基本上,API在一个阶段创建一个套接字,然后调用bind()打开一个端口进行侦听。通过传递getaddrinfo()返回的sockaddr来指定端口,并在服务参数中指定端口。随后,调用者可以选择分配多播组,调用在套接字上设置IP_ADD_MEMBERSHIP的API函数。
问题是,对于IPv6 (即,getaddrinfo的家庭提示是AF_UNSPEC而不是以前的AF_INET ),当用户请求IPv4多播组时,IP_ADD_MEMBERSHIP会失败。这是因为系统显然默认在未提供任何提示时提供IPv6地址。
显然,解决方案是提前知道用户将想要指定IPv4还是IPv6多播组。但是,由于我尝试的不是API本身的更改,因此此信息被认为是未知的。
我还有其他选择吗?
我尝试在IP_ADD_MEMBERSHIP之前关闭、重新创建和重新绑定套接字,但我的第二个bind()由于某种原因失败了。(我尝试指定SO_REUSEADDR,但这不起作用。)
有没有办法简单地“解除绑定”一个套接字,然后将它重新绑定到一个新的族?或者只是改变家庭,就这样?
发布于 2010-10-26 02:03:14
不可能。通常的解决方案是保留两个套接字,一个用于AF_INET,一个用于AF_INET6。
https://stackoverflow.com/questions/4017366
复制相似问题