gpt4 book ai didi

c++ - IPv6 到 IPv4 的转换只给出 0.0.0.1

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:43 28 4
gpt4 key购买 nike

我正在编写一个 Java 插入器(使用 LD_PRELOAD 方法)来修改网络通信系统调用(connect/sendto)中的接收者信息。

每当 Java 尝试连接到另一个套接字时,我都会修改预期的接收方 IP 和端口。 Java 使用 IPv4 映射的 IPv6 地址。所以,我需要提取它的 IPv4 部分。我使用 Nicolas Bachschmidt 在 link 规定的方法实现了这一点。 .

我面临的问题是,对于每个 IPv4 映射的 IPv6 地址,我获得的结果字符串(IPv4 部分)始终是 0.0.0.1。相反,它应该是 10.0.0.1(对于 ::ffff:10.0.0.1)。我用不同的 IP 地址试过这个。结果总是一样的。

我想提两件我认为可能相关的事情:

  1. 当我一个月前在我的本地网络(具有 192.168.1.XXX IP 地址)上测试同一个程序时,该程序运行正常。重点是(我不认为)代码有任何问题。为了验证这一点,我在 stackoverflow 上问了一个问题,将 IPv4 映射的 IPv6 地址转换为 IPv4,其链接在前面提到过)。

  2. 我正在尝试在我的大学网络(具有 10.XXX.XXX.XXX IP 地址)和 VirtualBox(NAT 模式也提供 10 .XXX.XXX.XXX 地址)。但是,在这些情况下,我尝试连接到 10.0.0.112.0.0.1。两者都给出 0.0.0.1

我做错了什么?

更新:在 Java 中,套接字连接是通过通常的方法完成的:

Socket conn = new Socket("10.0.0.1", 50021);

插入这个connect()系统调用的代码如下:

int connect(int fd, const struct sockaddr *sk, socklen_t sl)
{
struct sockaddr_in *lsk_in = (struct sockaddr_in *) sk;
struct sockaddr_in6 *lsk_in6 = (struct sockaddr_in6 *) sk;

struct sockaddr_in addr4;

unsigned int len;
int nbytes, oport, tport, ret, i;
char ip_address[30];
char buffer[1024];
char tempBuffer[1024];

if((lsk_in->sin_family == AF_INET) || (lsk_in->sin_family == AF_INET6))
{
if(lsk_in->sin_family == AF_INET)
{
oport = ntohs(lsk_in->sin_port);
memcpy(&addr4.sin_addr.s_addr, &lsk_in->sin_addr.s_addr, sizeof(addr4.sin_addr.s_addr));
}
else if(lsk_in->sin_family == AF_INET6)
{
oport = ntohs(lsk_in6->sin6_port);

//This is where the problem is. I always get 0.0.0.1
memcpy(&addr4.sin_addr.s_addr, lsk_in6->sin6_addr.s6_addr+12, sizeof(addr4.sin_addr.s_addr));
}

memset(buffer, '\0', sizeof(buffer));
sprintf(buffer, "%s%c%s%c%i", NAT_VM_CONNECT_RULE, NAT_VM_DELIMITER, (char *)inet_ntoa(addr4.sin_addr), NAT_VM_DELIMITER, oport);

nbytes = send(sock, buffer, strlen(buffer), 0);
if(DEBUG_MODE)
fprintf(stdout, "[LD_INTERPOSER] Sent[%s]\n", buffer);

memset(buffer, '\0', sizeof(buffer));
nbytes = recv(sock, buffer, sizeof(buffer), 0);

fprintf(stderr, "[LD_INTERPOSER] Received CONNECT [%s]\n", buffer);

memset(ip_address, '\0', sizeof(ip_address));
int pos = strrchr(buffer, NAT_VM_DELIMITER) - buffer;

strncpy(ip_address, buffer, pos);
ip_address[pos] = '\0';
tport = atoi(buffer + pos + 1);

if(lsk_in->sin_family == AF_INET)
{
lsk_in->sin_addr.s_addr = inet_addr(ip_address + 7);
lsk_in->sin_port = htons(tport);
}
else if(lsk_in->sin_family == AF_INET6)
{
inet_pton(AF_INET6, ip_address, &(lsk_in6->sin6_addr));
lsk_in6->sin6_port = htons(tport);
}

fprintf(stderr, "[LD_INTERPOSER] IP[%s], Port[%d] for VM[%s]\n", ip_address, tport, vm_ip);
}

return real_connect(fd, sk, sl);
}

最佳答案

感谢 @ugoren 十六进制转储技术(在评论中),我能够弄清楚 IPv6 结构本身包含一个 0.0.0.1 地址。我意识到问题可能是由于不同的 JDK。 Java 项目是使用 OpenJDK 7 构建的,而我使用的 PC 使用的是 OpenJDK 6。当我将 JDK 更新到版本 7 时,错误消失了。但是,它让我陷入了另一个错误,该错误记录在新的 stackoverflow question 中。我仍然无法解决。

关于c++ - IPv6 到 IPv4 的转换只给出 0.0.0.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11239050/

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