实现套接字接口(interface)以支持 IPV6 的最佳方法是什么。 现有代码仅支持 IPV4。现在,要支持 IPV6,我也没有什么疑问......
1) 我应该用 IPV6 API 替换 IPV4 的所有 API。比如 AF_INET6 的 AF_INET,sockaddr_in6 的 sockaddr_in 等。这些新 API 是否支持这两种协议(protocol)。
2) 或者我应该保持这种状态...
#ifdef IPV6_SUPPORT
sockaddr_in6 addr;
RTMemoryUtil::memset( &addr, 0, (int)sizeof( addr ) );
addr.sin6_family = AF_INET6;
addr.sin6_port = (unsigned short)htons( port );
RTMemoryUtil::memcpy( &addr.sin6_addr, address, (int)sizeof( *address ) );
#else
sockaddr_in addr;
RTMemoryUtil::memset( &addr, 0, (int)sizeof( addr ) );
addr.sin_family = AF_INET;
addr.sin_port = (unsigned short)htons( port );
RTMemoryUtil::memcpy( &addr.sin_addr, address, (int)sizeof( *address ) );
#endif
请指教有没有更好的方法或者第二个过程有什么缺陷。
最佳答案
从技术上讲,选项 (1) 或 (2) 都不是,您应该迁移到与 IP 系列无关的 API 并使用 struct sockaddr
和 struct sockaddr_storage
而不是 IPv4 和 IPv6 硬连线结构. Stevens 给出了创建不可知 API 的很好示例,这是我采用的类似方法:
http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/sockaddr.c
关于c++ - 实现套接字接口(interface)以同时支持 IPV6 和 IPV4 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5890875/