实际上,我正在将 IPv4 服务器应用程序移植到 Linux 上的双栈 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 的形式显示为普通的旧 IPv4 地址(不带 ::ffff:-prefix)?
谢谢泰迪