将IP地址转换为反向IP查找所需格式

7

我有一个IP地址,例如char *ip = "192.168.1.13",需要将其转换为"13.1.168.192"。在C语言中是否已经有合适的方法进行转换,还是我需要自己通过分割字符串并重新拼接来实现?


我认为一般情况下没有这样的字符串函数,但有一个常见的技巧:反转字符串中的每个“单词”(即“291.861.1.31”),然后再反转整个字符串。 - Sergey Kalinichenko
1
IPv4地址在第一位是32位的。这就是所有与套接字相关的函数中所表示的方式。也许可以使用htons等函数改变字节顺序? - KAction
你是否将反向DNS与直接颠倒IP地址混淆了? - ta.speot.is
不,我需要DNS查询13.1.168.192.in-addr.arpa的反向IP。 - wasp256
5个回答

10

你可以使用 inet_pton 将其转换为二进制形式,使其易于反转,然后再使用 inet_ntop 将其转换回文本。


请记住,IPv4地址只是32位无符号整数。交换这个整数的字节非常容易。

可以尝试以下代码:

const char ip[] = "192.168.0.1";
char reversed_ip[INET_ADDRSTRLEN];

in_addr_t addr;

/* Get the textual address into binary format */
inet_pton(AF_INET, ip, &addr);

/* Reverse the bytes in the binary address */
addr =
    ((addr & 0xff000000) >> 24) |
    ((addr & 0x00ff0000) >>  8) |
    ((addr & 0x0000ff00) <<  8) |
    ((addr & 0x000000ff) << 24);

/* And lastly get a textual representation back again */
inet_ntop(AF_INET, &addr, reversed_ip, sizeof(reversed_ip));

执行完这段代码后,变量reversed_ip将包含颠倒后的地址作为一个字符串。


目前为止,它得到了这个无符号字符缓冲区 unsigned char buf[sizeof(struct in_addr)]; inet_pton(AF_INET, "192.168.1.13", buf); 但我不太确定如何反转它? - wasp256

5
int a,b,c,d;
char *ip = "192.168.1.13"
char ip2[16];
sscanf(ip,"%d.%d.%d.%d",&a,&b,&c,&d);
sprintf(ip2, "%d.%d.%d.%d", d, c, b, a);

2
#include <stdio.h>
#include <string.h>

void swap(char *a, char *b){
    char wk = *a;
    *a = *b;
    *b = wk;
}

void strpartrev(char *s, int len){
    int i,j;
    for(i=0,j=len-1; i<len/2 ;++i,--j)
        swap(s + i, s + j);
}

char *strwordrev(char *str, char delimiter){
    //str change destructively
    int sp = -1, wordlen=0;
    char stack[16], *p=str;

    while(*p){
        if(*p == delimiter){
            strpartrev(stack + sp - wordlen + 1, wordlen);
            wordlen = 0;
        } else {
            ++wordlen;
        }
        stack[++sp] = *p++;
    }
    strpartrev(stack + sp - wordlen + 1 , wordlen);
    p = str;
    do{
        *p++ = stack[sp--];
    }while(sp>=0);

    return str;
}

char *strWordRev(char *str, char delimiter){
    //str change destructively
    char *head, *tail;
    int len = strlen(str);

    head = str;
    while(tail = strchr(head, delimiter)){
        strpartrev(head, tail - head);
        head = tail + 1;
    }
    strpartrev(head, str + len - head);
    strpartrev(str, len);

    return str;
}

int main(void){
    char *ip = "192.168.1.13";
    char rip[16];

    strcpy(rip, ip);
    printf("%s\n", strWordRev(rip, '.'));//13.1.168.192

    return 0;
}

1
将IP地址分割成数组,使用代码来反转该数组。 这里有一段不错的数组反转代码,我在这里找到了http://www.programmingsimplified.com/c-program-reverse-array
#include <stdio.h>

int main()
{
   int n, c, d, a[100], b[100];

   printf("Enter the number of elements in array\n");
   scanf("%d", &n);

   printf("Enter the array elements\n");

   for (c = 0; c < n ; c++)
      scanf("%d", &a[c]);

   /*
    * Copying elements into array b starting from end of array a
    */

   for (c = n - 1, d = 0; c >= 0; c--, d++)
      b[d] = a[c];

   /*
    * Copying reversed array into original.
    * Here we are modifying original array, this is optional.
    */

   for (c = 0; c < n; c++)
      a[c] = b[c];

   printf("Reverse array is\n");

   for (c = 0; c < n; c++)
      printf("%d\n", a[c]);

   return 0;
}

1
您可以使用getaddrinfo将字符串转换为addrinfo。指定AI_NUMERICHOST以防止进行DNS查找。
addrinfo hint;
memset(&hint, 0, sizeof(addrinfo));
hint.ai_socktype = SOCK_STREAM;
hint.ai_protocol = IPPROTO_TCP;
hint.ai_family = AF_INET;
hint.ai_flags = AI_NUMERICHOST; // prevents dns lookup

addrinfo *result = nullptr;
if (getaddrinfo(name, nullptr, &hint, &result))
    return false;

uint32_t ip;
memcpy(&ip, &result, sizeof(uint32_t));

uint32_t ipreversed = htonl(ip);

freeaddrinfo(result);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接