实际上,我将一个IPv4服务器应用程序移植到Linux上的双重堆栈IPv4/IPv6应用程序。将IPv4应用程序移植到Dualstack IPv4/IPv6
基本功能我以解决:
serv_addr.sin6_family = AF_INET6;
serv_addr.sin6_addr = in6addr_any;
...
bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
...
listen(sock, 5);
...
newsock = accept(syn->sock, (struct sockaddr *) &cli_addr, &clilen);
我可以与IPv4和IPv6连接和使用的连接。但是,当我想用IP:
switch(data->sa_family) {
case AF_INET:
inet_ntop(AF_INET, &(((struct sockaddr_in*)data)->sin_addr), buffer, size);
break;
case AF_INET6:
inet_ntop(AF_INET6, &(((struct sockaddr_in6*)data)->sin6_addr), buffer, size);
break;
default:
buffer[0] = '?';
buffer[1] = 0;
}
我总是得到一个IPv6地址不如预期,或者如果它是一个IPv4连接类似于将:: ffff:127.0.0.1
我有什么更改为以127.0.0.1(不带:: ffff:-prefix)形式显示为普通旧IPv4地址?
感谢 泰迪