实现套接字接口以支持IPV6和IPV4的最佳方式

Kun*_*mar 1 c++ sockets ipv6

实现套接字接口以支持IPV6的最佳方法是什么.现有代码仅支持IPV4.现在,为了支持IPV6,我也很少有疑问......

1)_I应该用IPV6 API替换IPV4的所有API.通过AF_INET6说AF_INET,通过sockaddr_in6说sockaddr_in等.这些新API是否支持这两种协议.

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
Run Code Online (Sandbox Code Playgroud)

请建议是否有更好的方法或第二个过程中的缺陷是什么.

Ste*_*e-o 5

从技术上讲,无论是(1)还是(2),您都应该迁移到与IP系列无关的API,并使用struct sockaddrstruct sockaddr_storage不是IPv4和IPv6硬连线结构.史蒂文斯提供了创建不可知API的好例子,这是我采用的类似方法:

http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/sockaddr.c