c++ - Conversion of IPv6 to IPv4 gives 0.0.0.1 only -
i writing java interposer (using ld_preload method) modifies recipient information in network communication system calls (connect/sendto).
whenever java tries connect socket, modify intended recipient ip , port. java uses ipv4-mapped-ipv6 addresses. so, need extract ipv4 part of it. achieve using method prescribed nicolas bachschmidt @ link.
the problem facing every ipv4-mapped-ipv6 address, result string (ipv4 part) obtain 0.0.0.1
. instead should 10.0.0.1
(for ::ffff:10.0.0.1
). have tried different ip addresses. result same.
two things mention think may related:
when tested same program month ago on local network (that has
192.168.1.xxx
ip addresses), program worked correctly. point being (i don't think) there problem code. verify this, asked question on stackoverflow convert ipv4-mapped-ipv6 addresses ipv4, link of mentioned earlier).i trying test program on university network (that has
10.xxx.xxx.xxx
ip addresses) , virtualbox (nat mode gives10.xxx.xxx.xxx
addresses). however, have tried connect10.0.0.1
,12.0.0.1
in these cases. both give0.0.0.1
.
what doing wrong?
update: in java, socket connection done usual method:
socket conn = new socket("10.0.0.1", 50021);
the code interpose connect() system call follows:
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 problem is. 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] vm[%s]\n", ip_address, tport, vm_ip); } return real_connect(fd, sk, sl); }
thanks @ugoren hex dump technique (in comments), able figure out ipv6 structure contained 0.0.0.1
address. realized problem may due different jdks. java project built using openjdk 7 while pc using had openjdk 6. when updated jdk version 7, error disappeared. however, has landed me error documented @ new stackoverflow question still unable resolve.
Comments
Post a Comment