Windows中编程级别的IPv6和IPv4有什么区别?
我们可以将IPv4地址更改为IPV6并保持所有其他程序相同,是否有效?
答案 0 :(得分:2)
这实际上取决于你的程序是做什么的。
IPV6地址需要16个字节,而不是IPV4使用的4个字节。字符串表示也不同。
创建套接字几乎是一样的:
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
只需将PF_INET更改为PF_INET6。
连接有点不同:
nRet = connect(sock,
reinterpret_cast<SOCKADDR *>(&SockAddr),
sizeof(SockAddr));
在IPV4中,SockAddr是一个sockaddr_in结构,在IPV6中它是一个sockaddr_in6。
你必须使用类似getaddrinfo()的东西来初始化SockAddr,因为gethostbyname()不适用于IPV6。
bind(),listen()和accept()更相同。一旦建立套接字,读取,写入等与IP版本无关。
如果您在更高级别(例如HTTP)工作,您的程序不需要任何更改,但可能需要链接到不同的库。
答案 1 :(得分:2)
IPv6规范(RFC 3493)定义了一些新的API方法和数据结构。 Microsoft在Windows中实现了API的早期版本(RFC 2553),因此存在一些差异。此链接描述了差异,并分解了什么版本的Windows支持的API:
http://tdistler.com/2011/02/28/cross-platform-ipv6-socket-programming