пытаясь перейти от гекса (база 16) к dec в ip6 / proc / net / tcp6 - PullRequest
0 голосов
/ 02 сентября 2010

я читаю содержимое файла / proc / net / tcp6

и пытается преобразовать эту запись ip6 в '0 :: 1', как

ранее с ipv4 y используйте следующий метод.

struct sockaddr_in tmp_ip;
char ip_str[30];
char ipex[]='00000AF0'; /*read from the file /proc/net/tcp */
tmp_ip.sin_addr.s_addr=(int)strtoll(ipex,NULL,16);
inet_ntop(AF_INET,&tmp_ip.sin_addr,ip_str,60);
printf("ip=%s \n",ip_str);

но с ipv6 содержимое / proc / net / tcp6 больше (33 шестнадцатеричных символа) и, возможно, мне нужно использовать sockaddr_in6, но переменная sin6_addr.s6_addr является массивом, а не единственным журналом без знака int (например, sin_addr.s_addr)

так что в резюме. я пытаюсь передать это

0000000000000000FFFF00001F00C80A

что-то вроде

::ffff:10.200.0.31

редактирование ..

ммм, может быть, если я разложу этот ex на 16 экс-цифр и передам массив в sin6_addr.s_addr. Потому что 1F00C80A = 10.200.0.31 (через функцию ntop)

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Вы можете использовать sscanf() для непосредственного преобразования строки в элементы массива s6_addr:

struct in6_addr tmp_ip;
char ip_str[128];
char ipex[]="0000000000000000FFFF00001F00C80A";

if (sscanf(ipex,
    "%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx",
    &tmp_ip.s6_addr[3], &tmp_ip.s6_addr[2], &tmp_ip.s6_addr[1], &tmp_ip.s6_addr[0],
    &tmp_ip.s6_addr[7], &tmp_ip.s6_addr[6], &tmp_ip.s6_addr[5], &tmp_ip.s6_addr[4],
    &tmp_ip.s6_addr[11], &tmp_ip.s6_addr[10], &tmp_ip.s6_addr[9], &tmp_ip.s6_addr[8],
    &tmp_ip.s6_addr[15], &tmp_ip.s6_addr[14], &tmp_ip.s6_addr[13], &tmp_ip.s6_addr[12]) == 16)
{
    inet_ntop(AF_INET6, &tmp_ip, ip_str, sizeof ip_str);
    printf("ip=%s \n",ip_str);
}
0 голосов
/ 02 сентября 2010

спасибо. я закончил делать это.

cont_ip6=0; 
        cont=0;
        for(i=0;i<34;i++) {
                if (cont ==2) {
                        cont=0;
                        hex_section[2]='\0';
                                tmp_ip6.sin6_addr.s6_addr[cont_ip6]=strtol(hex_section,NULL,16);

                        cont_ip6++;
                }

                hex_section[cont]=ipex[i];
                cont++;

        }

затем inet_ntop

я это исправил.

вам нужно инвертировать каждую пару шестнадцатеричных чисел.

:: FFFF: 10.200.0.31 закончился в массиве следующим образом.

(последние элементы)

FF     |FF    |   00   | 00  :  0A | C8   |   00 | 1F
255    |255   |   0    | 0   :  10 | 200  |   0  | 31

^       ^         ^      ^   :  ^     ^       ^     ^
|       |         |      |      |     |       |     |
|        ---------       |      |      -------      |
 ------------------------        -------------------

так что вам нужно поменять их местами (в каждом наборе чисел)

так что я делаю это

tmptmp=0;
for (i=0;i<5;i++){
    tmptmp=tmp_ip6.sin6_addr.s6_addr[i*4+3];
    tmp_ip6.sin6_addr.s6_addr[i*4+3]=tmp_ip6.sin6_addr.s6_addr[i*4];
    tmp_ip6.sin6_addr.s6_addr[i*4]=tmptmp;

    tmptmp=tmp_ip6.sin6_addr.s6_addr[i*4+2];
    tmp_ip6.sin6_addr.s6_addr[i*4+2]=tmp_ip6.sin6_addr.s6_addr[i*4+1];
    tmp_ip6.sin6_addr.s6_addr[i*4+1]=tmptmp;
 }

это меняет местами наборы, и когда вы делаете inet_ntop, он показывает :: FFFF: 10.200.0.31

(я искал это весь день D: у меня болит голова) (извините за мой плохой английский)

...