c++ - 实现套接字接口(interface)以同时支持 IPV6 和 IPV4 的最佳方式

标签 c++ sockets ipv6

实现套接字接口(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 sockaddrstruct 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/

相关文章:

.net - 阻塞 TCP 套接字写入然后立即关闭 - 这是一个问题吗?

c - 我如何将这个ipv6地址分配给c中的sscanf?

c++ - 替换循环以通过标准库插入和更新集合

c++ - 我需要访问一个随机的 .txt 文件,或者一个 .txt 文件的随机行,然后把它放到屏幕上

c++ - 将 map 转换为在 STL 中设置

Java ArrayList 序列化问题

c - 通过 BSD 套接字获取我计算机在本地网络上的 IP 地址?

c++ - boost::scoped_ptr 和 C++ 中的 STL

java - 是否有将 ipv6 地址 fd00::识别为本地/私有(private)的 java api?

python - 如何从当前网络地址递增并获取下一个 IPv6 网络地址