2017-03-13 24 views
0

我得到了一個名爲ipv6的字符串,其中包含IPv6地址。 我想使用IP作爲zen spamhaus或其他DNS的DNSBL。 我該怎麼做?以下代碼在壓縮的IPv6中無法正常工作。我怎樣才能零填充? C++中的所有代碼。在C++中爲DNSBL製作反向ipv6

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

回答

0

這個程序有多個問題:

  1. string retorno = str2;沒有命名空間,並且'string' was not declared in this scope是編譯器錯誤。很容易修復。

    std::string retorno = str2; 
    
  2. struct in6_addr *addr;只分配了指針的結構空間,但對結構本身的內存空間還沒有分配。這是事故的直接原因。

    我只是通過在堆棧中分配它,並且因爲它不再是指針而使用.而不是->來訪問結構成員。

    struct in6_addr addr; 
    

    一旦你解決這個問題,但是,你的程序將再次崩潰,因爲:

  3. char str2是該直線sprintf編了進去,這需要47個打印字符和一個空太小終止。

    這是很輕鬆地打補丁:

    char str2[48]; 
    
  4. 顯式類型轉換到int是不必要的,可以省略。

的工作程序是這樣的:

#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()); 
} 

這解決所有的崩潰和打印輸出:

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

但我認爲這是不完全是你說的輸出你要。您將需要更改sprintf調用,以您想要的格式準確打印您想要的內容。

+0

不,這不是我要找的。請你能強化我的程序來顯示所有的ipv6反轉和虛線嗎?謝謝。 –

+0

@RodrigoSantidrianLucas不,[so]不是代碼寫入服務。 –