cercando di passare da esadecimale (base 16) per dec a IP6 / proc / net / tcp6
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)
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);
}