在C中创建特定范围内的ip地址列表

在C中创建特定范围内的ip地址列表,c,iteration,C,Iteration,我正在编写一个工具来扫描网络上的所有节点,但我遇到了一个问题。我正在用C语言编写这个工具,但我对这种语言还不熟悉,所以我不确定这个工具是如何遍历地址范围的 用户将给出参数192.168.*.*并创建该范围内的每个IP地址,例如192.168.1.1、192.168.1.2、192.168.1.3,然后最终创建192.168.2.1、192.168.2.2、192.168.2.3等 我以前的代码是: #include <stdio.h> #include <stdlib.h>

我正在编写一个工具来扫描网络上的所有节点,但我遇到了一个问题。我正在用C语言编写这个工具,但我对这种语言还不熟悉,所以我不确定这个工具是如何遍历地址范围的

用户将给出参数192.168.*.*并创建该范围内的每个IP地址,例如192.168.1.1、192.168.1.2、192.168.1.3,然后最终创建192.168.2.1、192.168.2.2、192.168.2.3等

我以前的代码是:

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

void scanner(int s) 
{
    char addr[20];

    for (int i = 0; i < 255; ++i) 
    {
        sprintf(addr, "192.168.%d.%d", s, i);
        printf("%s\n", addr);
    }
 }

int main() 
{

    for (int i = 0; i < 255; ++i) 
    {
        scanner(i);
    }

    return 0;
}
#包括
#包括
#包括
无效扫描程序(INTS)
{
char addr[20];
对于(int i=0;i<255;++i)
{
sprintf(addr,“192.168.%d.%d”,s,i);
printf(“%s\n”,addr);
}
}
int main()
{
对于(int i=0;i<255;++i)
{
扫描仪(一);
}
返回0;
}

但我不知道如何从用户输入运行这个

您可以使用scanf功能获取用户的输入。我已更新您的代码以使用相同的-

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

int addr_byte_0;
int addr_byte_1;

void scanner(int s) 
{
    char addr[200];
    int i;
    for (i = 0; i < 255; ++i) 
    {
        sprintf(addr, "%d.%d.%d.%d", addr_byte_0, addr_byte_1, s, i);
        printf("%s\n", addr);
    }
 }

int main() 
{
    int i;
    //printf("Enter the first byte of the address: ");
    scanf ("%d", &addr_byte_0);
    //printf("Enter the second byte of the address: ");
    scanf ("%d", &addr_byte_1);
    for (i = 0; i < 255; ++i) 
    {
        scanner(i);
    }

    return 0;
}
#包括
#包括
#包括
int addr_字节0;
int addr_字节_1;
无效扫描程序(INTS)
{
字符地址[200];
int i;
对于(i=0;i<255;++i)
{
sprintf(地址,“%d.%d.%d.%d”,地址字节0,地址字节1,s,i);
printf(“%s\n”,addr);
}
}
int main()
{
int i;
//printf(“输入地址的第一个字节:”);
scanf(“%d”,&addr\u字节0);
//printf(“输入地址的第二个字节:”);
scanf(“%d”&添加字节1);
对于(i=0;i<255;++i)
{
扫描仪(一);
}
返回0;
}

此外,根据C标准,您不能在for循环中声明变量。因此,我将声明移出for循环。希望这有帮助

受(例如python-)生成器的启发,我的解决方案不执行动态内存分配,并且具有恒定的内存消耗。我不喜欢现在依赖于
do while
循环。另外,
ig->num_通配符==0
的显式检查也很糟糕。无论如何:

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

#define IP_OCTETS 4
#define MAX_UCHAR 255

typedef struct {
    int wildcard_pos[IP_OCTETS];
    int num_wildcards;
    int counter[IP_OCTETS];
    int octet[IP_OCTETS];
} ip_generator;

char* mystrsep(char** stringp, const char* delim)
{
    char* start = *stringp;
    char* p;

    p = (start != NULL) ? strpbrk(start, delim) : NULL;

    if (p == NULL)
    {
        *stringp = NULL;
    }
    else
    {
        *p = '\0';
        *stringp = p + 1;
    }

    return start;
}

void init_ip_gen(ip_generator *ig, char* ip_mask)
{
    char *token, *string;
    char* ip_mask_ptr = ip_mask;
    const char delimiters[] = ".";
    int i = 0;

    while ((token = mystrsep(&ip_mask_ptr, delimiters)) != NULL)
    {
        ig->wildcard_pos[i] = -1;
        if (strcmp(token, "*") == 0)
        {
            ig->wildcard_pos[ig->num_wildcards] = i;
            ig->counter[ig->num_wildcards] = 1;
            ig->num_wildcards++;
        }
        else
        {
            ig->octet[i] = atoi(token);
        }
        i++;
    }
}

int ig_next(ip_generator *ig)
{
    int i;
    int carry = 1;

    if (ig->num_wildcards == 0)
    {
        return 0;
    }

    for (i = ig->num_wildcards - 1; i >= 0; i--)
    {
        if (carry == 1)
        {
            if (ig->counter[i] == MAX_UCHAR)
            {
                ig->counter[i] = 1;
            }
            else
            {
                ig->counter[i]++;
                carry = 0;
            }
        }
        if (carry == 0)
        {
            break;
        }
        if (i == 0 && carry == 1)
        {
            return 0;
        }
    }

    return 1;
}

void generate_ip(ip_generator *ig, char *ip)
{
    int i;
    int j = 0;

    int oct[IP_OCTETS];

    for (i = 0; i < IP_OCTETS; i++)
    {
        if (i == ig->wildcard_pos[j])
        {
            oct[i] = ig->counter[j];
            j++;
        }
        else
        {
            oct[i] = ig->octet[i];
        }
    }

    sprintf(ip, "%d.%d.%d.%d", oct[0], oct[1], oct[2], oct[3]);
}

int main()
{
    char ip_mask[] = "192.*.10.*";
    //char ip_mask[] = "192.1.10.123";

    ip_generator ig;
    memset(&ig, 0, sizeof(ig));
    init_ip_gen(&ig, ip_mask);

    char ip[32];
    memset(ip, 0, sizeof(ip));

    do
    {
        generate_ip(&ig, ip);
        printf("%s\n", ip);
    } while (ig_next(&ig));

    return 0;
}
#包括
#包括
#包括
#定义IP_八位组4
#定义最大值255
类型定义结构{
整型通配符位置[IP_八位字节];
int-num_通配符;
整数计数器[IP_八位字节];
int八位组[IP_八位组];
}ip_发生器;
char*mystrsep(char**stringp,const char*delim)
{
char*start=*stringp;
char*p;
p=(start!=NULL)?strpbrk(start,delim):NULL;
if(p==NULL)
{
*stringp=NULL;
}
其他的
{
*p='\0';
*stringp=p+1;
}
返回启动;
}
无效初始ip生成(ip生成程序*ig,字符*ip掩码)
{
字符*标记,*字符串;
char*ip_mask_ptr=ip_mask;
常量字符分隔符[]=”;
int i=0;
while((token=mystrsep(&ip\u mask\u ptr,分隔符))!=NULL)
{
ig->通配符位置[i]=-1;
如果(strcmp(标记,“*”)==0)
{
ig->通配符位置[ig->num\u通配符]=i;
ig->计数器[ig->num_通配符]=1;
ig->num_通配符++;
}
其他的
{
ig->octet[i]=atoi(令牌);
}
i++;
}
}
int ig_next(ip_生成器*ig)
{
int i;
整数进位=1;
如果(ig->num_通配符==0)
{
返回0;
}
对于(i=ig->num_通配符-1;i>=0;i--)
{
如果(进位==1)
{
如果(ig->计数器[i]==最大值)
{
ig->计数器[i]=1;
}
其他的
{
ig->计数器[i]++;
进位=0;
}
}
如果(进位==0)
{
打破
}
如果(i==0&&carry==1)
{
返回0;
}
}
返回1;
}
无效生成ip(ip生成程序*ig,字符*ip)
{
int i;
int j=0;
int oct[IP_八位字节];
对于(i=0;i通配符位置[j])
{
oct[i]=ig->计数器[j];
j++;
}
其他的
{
oct[i]=ig->octet[i];
}
}
sprintf(ip,“%d.%d.%d.%”,10月[0],10月[1],10月[2],10月[3]);
}
int main()
{
字符ip_掩码[]=“192.*.10.*”;
//字符ip_掩码[]=“192.1.10.123”;
ip_发生器ig;
memset(&ig,0,sizeof(ig));
初始ip生成(&ig,ip掩码);
char-ip[32];
memset(ip,0,sizeof(ip));
做
{
生成_ip(&ig,ip);
printf(“%s\n”,ip);
}while(ig_next(&ig));
返回0;
}

“编写一个工具来扫描网络上的所有节点……但我对这门语言还不熟悉”首先从基本知识开始。您的要求还不清楚。你想为带有任意通配符的掩码生成IP地址吗?是的,对于所有通配符@nucleonI了解如何进行网络方面的工作,我只是不确定是否创建了IP范围@t0mm13bThanks!你认为我能适应argv的观点吗?需要大的改变吗@是的。你甚至可以用它。确保用户在运行代码时提供输入参数。“按照C标准,您不能在for循环中声明变量”这是错误的(除非您仍然生活在90年代)。看:哇!非常感谢。虽然我很抱歉,但我不认为我能正确地实现它,因为我不知道里面发生了什么,啊哈@核子