首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++中创建DNSBL的反向ipv6

在c++中创建DNSBL的反向ipv6
EN

Stack Overflow用户
提问于 2017-03-14 06:53:39
回答 1查看 351关注 0票数 0

我得到了一个带有ipv6地址的名为IPv6的字符串。我想在DNSBL中使用该IP作为zen spamhaus或其他DNS。我该怎么做呢?以下代码在压缩的IPv6中不能按预期工作。我怎样才能填零?所有代码都在C++中。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2017-03-14 11:08:01

此程序有多个问题:

  1. string retorno = str2;没有名称空间,'string' was not declared in this scope是编译器错误。很容易修复。

string retorno = str2;

  • struct in6_addr *addr;只为指向结构的指针分配空间,但决不会为结构本身分配内存。这是崩溃的直接原因。

我将通过在堆栈上分配它来快速修复它,并且因为它不再是一个指针,所以使用.而不是->来访问结构成员。

结构in6_addr地址;

但是,一旦你修复了这个问题,你的程序将再次崩溃,因为:

  • char str2对于被sprintf到它里面的行来说太小了,这需要47个打印字符和一个空结束符。

这很容易修补:

char str248;

  • int的显式类型转换是不必要的,可以省略。

一个正常工作的程序应该是这样的:

代码语言:javascript
复制
#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());
}

这将解决所有崩溃并打印输出:

代码语言:javascript
复制
91.68.ba.c8.85.66.54.0b.a7.ec.a8.fd.b8.0d.01.20

但我认为这并不是你所说的你想要的输出。您需要更改sprintf调用,以便以所需的格式精确地打印所需的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42774904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档