gpt4 book ai didi

ipv6 - 将 IPv4 应用移植到双栈 IPv4/IPv6

转载 作者:行者123 更新时间:2023-12-02 05:20:24 25 4
gpt4 key购买 nike

实际上,我正在将 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:- 前缀)?

谢谢泰迪熊

最佳答案

有一个宏可以提供帮助,但只成功了一半:

  if (IN6_IS_ADDR_V4MAPPED(&serv_addr.sin6_addr)) {
struct sockaddr_in tmpsa;
tmpsa.sin_family = AF_INET;
tmpsa.sin_port = 0;
tmpsa.sin_addr.s_addr = serv_addr.sin6_addr.s6_addr32[3];
/* process IPv4 address in tmpsa ... */
inet_ntop (AF_INET, &tmpsa.sin_addr, buffer, size);
} else {
/* process IPv6 address in serv_addr.. */
inet_ntop (AF_INET6, &serv_addr.sin6_addr, buffer, size);
}

根据平台的不同,可能需要稍作修改,这里使用 GNU 标准。

关于ipv6 - 将 IPv4 应用移植到双栈 IPv4/IPv6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13949750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com