2017-03-13 2 views
0

Ich habe eine Zeichenfolge namens IPv6 mit IPv6-Adresse. Ich möchte die IP in DNSBL als Zen-Spamhaus oder andere DNS verwenden. Wie kann ich es tun? Der folgende Code funktioniert nicht wie erwartet in komprimiertem IPv6. Wie kann ich null füllen? Der ganze Code in C++.machen Sie eine umgekehrte ipv6 für DNSBL in C++

std::string invertirv6 (const std::string &str) { 
    struct in6_addr *addr; 
    inet_pton(AF_INET6,str.c_str(),&addr); 
    char str2[41]; 

    sprintf(str2,"%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x", 
    (int)addr->s6_addr[15], (int)addr->s6_addr[14], 
    (int)addr->s6_addr[13], (int)addr->s6_addr[12], 
    (int)addr->s6_addr[11], (int)addr->s6_addr[10], 
    (int)addr->s6_addr[9], (int)addr->s6_addr[8], 
    (int)addr->s6_addr[7], (int)addr->s6_addr[6], 
    (int)addr->s6_addr[5], (int)addr->s6_addr[4], 
    (int)addr->s6_addr[3], (int)addr->s6_addr[2], 
    (int)addr->s6_addr[1], (int)addr->s6_addr[0]); 
    string retorno = str2; 
    return retorno; 
} 

Antwort

0

Dieses Programm hat mehrere Probleme:

  1. string retorno = str2; keinen Namensraum hat, und 'string' was not declared in this scope ist der Compiler-Fehler. Einfach genug, um es zu reparieren.

    std::string retorno = str2; 
    
  2. struct in6_addr *addr; ordnet nur Platz für einen Zeiger auf eine Struktur, aber der Speicher für die Struktur selbst wird nie zugewiesen. Dies ist die unmittelbare Ursache des Absturzes.

    Ich werde nur schnell beheben, indem Sie es auf dem Stapel zuweisen, und da es nicht mehr ein Zeiger ist, greifen Sie auf die Strukturelemente mit . statt ->.

    struct in6_addr addr; 
    

    Sobald Sie beheben, dass, wenn Ihr Programm wieder abstürzt, wegen:

  3. Die char str2 ist zu klein für die Linie ist sprintf ed hinein, die 47 Zeichen Druck erfordert und ein Null Terminator.

    , die leicht genug gepatcht:

    char str2[48]; 
    
  4. Die explizite Typumwandlung zu int nicht notwendig ist und weggelassen werden kann.

Ein Arbeitsprogramm würde wie folgt aussehen:

#include <cstdio> 
#include <string> 
#include <arpa/inet.h> 
#include <sys/socket.h> 

std::string invertirv6 (const std::string &str) { 
    struct in6_addr addr; 
    inet_pton(AF_INET6,str.c_str(),&addr); 
    char str2[48]; 

    sprintf(str2,"%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x", 
    addr.s6_addr[15], addr.s6_addr[14], 
    addr.s6_addr[13], addr.s6_addr[12], 
    addr.s6_addr[11], addr.s6_addr[10], 
    addr.s6_addr[9], addr.s6_addr[8], 
    addr.s6_addr[7], addr.s6_addr[6], 
    addr.s6_addr[5], addr.s6_addr[4], 
    addr.s6_addr[3], addr.s6_addr[2], 
    addr.s6_addr[1], addr.s6_addr[0]); 
    std::string retorno = str2; 
    return retorno; 
} 

int main(void) { 
    std::string a = "2001:db8:fda8:eca7:b54:6685:c8ba:6891"; 
    std::string b = invertirv6(a); 

    printf("%s\n", b.c_str()); 
} 

Dies löst alle Abstürze und druckt Ausgabe:

91.68.ba.c8.85.66.54.0b.a7.ec.a8.fd.b8.0d.01.20 

Aber ich denke, dass das nicht genau ist die Ausgabe, die Sie sagen, Sie wollen. Sie müssen den Anruf sprintf ändern, um genau das zu drucken, was Sie in dem gewünschten Format wünschen.

+0

Nein, das ist nicht was ich suche. Bitte können Sie mein Programm verbessern, um alle ipv6 umgekehrt und punktiert anzuzeigen? Vielen Dank. –

+0

@RodrigoSantidrianLucas Nein, [so] ist kein Code-Schreibdienst. –

Verwandte Themen