Domanda

im leggere il contenuto del file / proc / net / tcp6

e cercando di trasformare quella notazione di IP6 in un '0 :: 1' come

precedentemente con IPv4 y utilizzare il metodo successivo.

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);

ma con ipv6 il contenuto di / proc / / net tcp6 suoi più grandi (33 caratteri esadecimali) e forse ho bisogno di usare     sockaddr_in6, ma la sin6_addr.s6_addr variabile è un array, non un singolo log int senza segno (come sin_addr.s_addr)

così nel curriculum. Ho cercando di far passare questo

0000000000000000FFFF00001F00C80A

a qualcosa di simile

::ffff:10.200.0.31

modifica ..

mmm Forse se scomponiamo che l'ex in 16 ex cifre e alimentare la matrice in sin6_addr.s_addr.  Perché 1F00C80A = 10.200.0.31 (passando attraverso la funzione ntop)

È stato utile?

Soluzione 2

Grazie. Ho finito di fare questo.

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++;

        }

quindi inet_ntop

ho riparato.

è necessario invertire ogni coppia di numeri esadecimali.

:: FFFF:. 10.200.0.31 conclusa nella matrice come questo

(ultimi elementi)

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

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

quindi è necessario scambiare questi (in ogni set di numeri)

in modo che io faccio

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;
 }

Questa scambiare i set e quando lo fai un inet_ntop mostra :: ffff: 10.200.0.31

(ero alla ricerca di questo tutto il giorno D :, la mia testa fa male) (Dispiace per il mio cattivo inglese)

Altri suggerimenti

È possibile utilizzare sscanf() per direttamente convertire la stringa negli elementi dell'array 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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top