【问题标题】:convert IP for reverse ip lookup转换 IP 以进行反向 ip 查找
【发布时间】:2013-04-28 16:52:53
【问题描述】:

我有一个 IP 地址,例如char *ip = "192.168.1.13" 并且需要将其转换成这个"13.1.168.192" 在 C 中是否已经存在适当的可能性,还是我必须自己通过简单地制作标记并将它们重新组合在一起来完成?

【问题讨论】:

  • 我不认为一般的字符串有这样的功能,但是有一个常见的技巧:反转字符串中的每个“单词”(即"291.861.1.31"),然后反转整个字符串。
  • IPv4 地址首先是 32 位。这就是它在所有与套接字相关的函数中的表示方式。或许可以使用htons 和朋友来改变字节顺序?
  • 您是否将反向 DNS 与字面反向 IP 地址混淆了?
  • 不,我需要 DNS 查询的反向 IP 13.1.168.192.in-addr.arpa

标签: c string ip-address reverse


【解决方案1】:

您始终可以使用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);但我现在不太确定如何扭转它?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以使用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);
    

    【讨论】:

      【解决方案4】:
      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);
      

      【讨论】:

        【解决方案5】:
        #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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-07
          • 2011-03-25
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 2015-08-10
          相关资源
          最近更新 更多