如何在循环中增加IP地址? [C]

时间:2013-08-15 16:34:10

标签: c for-loop ip

我知道这对你们大多数人来说非常简单,但我试图在循环中将ip地址增加+1。

示例:

for(double ip = 1.1.1.1; ip < 1.1.1.5; ip++)
{
printf("%f", ip);
}

基本上我所要做的就是在for循环中将ip增加+1。 我不知道存储ip的变量类型,也不知道如何增加它。 每当我运行程序时,我都会收到错误消息,说明该数字的小数点太多。 我还在互联网上看到你必须在一个字符数组中存储ip,但是你不能增加一个字符数组(我知道)。 我应该在什么变量类型中存储ip /我该如何处理?谢谢。

3 个答案:

答案 0 :(得分:2)

一个天真的实现(没有inet_pton)会使用4个数字并将它们打印到char数组

#include <stdio.h>

int inc_ip(int * val) {
    if (*val == 255) {
        (*val) = 0;
        return 1;
    }
    else {
        (*val)++;
        return 0;
    }
}   

int main() {
    int ip[4] = {0};
    char buf[16] = {0};

    while (ip[3] < 255) {
        int place = 0;
        while(place < 4 && inc_ip(&ip[place])) {
            place++;
        }
        snprintf(buf, 16, "%d.%d.%d.%d", ip[3],ip[2],ip[1],ip[0]);
        printf("%s\n", buf);
    }
}

*编辑:受alk启发的新实现

struct ip_parts {
    uint8_t vals[4];
};

union ip {
    uint32_t val;
    struct ip_parts parts;
};

int main() {
    union ip ip = {0};
    char buf[16] = {0};

    while (ip.parts.vals[3] < 255) {
        ip.val++;
        snprintf(buf, 16, "%d.%d.%d.%d", ip.parts.vals[3],ip.parts.vals[2],
                                        ip.parts.vals[1],ip.parts.vals[0]);
        printf("%s\n", buf);
    }
}

答案 1 :(得分:0)

如果您正在搜索同一子网1.1.1。整个时间你可以存储最后一个八位字节作为唯一的int。

int lastoctet = 1;

循环遍历每次增加lastoctet并将其附加到你的字符串。

我不熟悉C语法,所以

//Declare and set int lastoctet = 1
//set ipstring, string ipstring = "1.1.1."
//Loop and each time increase lastoctet
   //ipstring = ipstring & lastoctet.tostring
   //perform actions
   //lastoctet++
//end loop

如果您正在搜索更多八位字节或需要增加其他数字,您可以将该八位字节存储为单独的整数,并在循环之前或期间重新设置字符串。

答案 2 :(得分:0)

IPV4地址为32位宽。

为什么不采用32位宽的无符号整数(例如uint32_t)将其初始化为任何起始值,将其计数并使用适当的libc函数将结果转换为ip-address的虚线字符串版本?

有关后者的进一步参考,请参阅inet_XtoY()函数族的手册页。