gpt4 book ai didi

c - in_addr_t,从一个IP跳转到下一个IP

转载 作者:行者123 更新时间:2023-11-30 15:38:29 24 4
gpt4 key购买 nike

我的程序旨在浏览一系列由起始IP和结束IP分隔的IP。以下是本地无线网络上的示例:

MyIP & Netmask = 192.168.1.0
MyIP | ~Netmask = 192.168.1.255

我的程序必须能够迭代所有可用的 IP,从 192.168.1.1 到 192.168.1.254,但我找不到恒定或“正确”的方法来获取 IP 与另一个 IP 之间的距离。这是我用于测试的示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char** argv)
{
struct sockaddr_in addr1, addr2, addr3, addr4, addr5;

addr1.sin_addr.s_addr = inet_addr("192.168.1.1");
addr2.sin_addr.s_addr = inet_addr("192.168.1.2");
addr3.sin_addr.s_addr = inet_addr("192.168.1.3");
addr4.sin_addr.s_addr = inet_addr("192.168.1.255");
addr5.sin_addr.s_addr = inet_addr("192.168.2.1");

fprintf(stdout, "addr2 - addr1 = %u\n", addr2.sin_addr.s_addr - addr1.sin_addr.s_addr);
fprintf(stdout, "addr3 - addr2 = %u\n", addr3.sin_addr.s_addr - addr2.sin_addr.s_addr);
fprintf(stdout, "addr4 - addr3 = %u\n", addr4.sin_addr.s_addr - addr3.sin_addr.s_addr);
fprintf(stdout, "addr5 - addr4 = %u\n", addr5.sin_addr.s_addr - addr4.sin_addr.s_addr);

return EXIT_SUCCESS;
}

我得到以下输出:

addr2 - addr1 = 16777216
addr3 - addr2 = 16777216
addr4 - addr3 = 4227858432
addr5 - addr4 = 33619968

现在,我明白为什么 192.168.1.1 和 192.168.1.2 之间的距离是 16777216 (2^24)。现在,有什么方法可以“正确”获取上述值,如果可能的话,使用预定义的常量(以点格式操作 IP 字符串并不是真正的解决方案)?

  • 我需要在 in_addr_t 值中添加什么才能从 192.168.1.1 跳转到 192.168.1.2?
  • 我需要在 in_addr_t 值中添加什么,才能在更大的子网上从 175.1.1.255 跳转到 175.1.2.0 ?那么 A 类 IP 又如何呢?
  • 是否可以使用网络信息来确定“间隙”值,以防我的子网更加具体?
  • 我是否缺少一种更简单/更干净的方法来解决我的迭代问题?

最佳答案

这是一个字节序问题

在您的系统中,inet_addr("192.168.1.1") 按以下方式返回以 4 个八位字节表示的 IP 地址:

    0x01 | 0x01 | 0xA8 | 0xC0
// 1 . 1 . 168 . 192

inet_addr("192.168.1.2") 返回

    0x02 | 0x01 | 0xA8 | 0xC0
// 2 . 1 . 168 . 192

区别inet_addr("192.168.1.2") - inet_addr("192.168.1.2")将是:

0x0201A8C0 - 0x0101A8C0 = 0x1000000 // in decimal is 16777216

对每个 inet_addr() 使用 htonl() 函数以避免字节序问题

因此 inet_addr("192.168.1.2")htonl() 将返回

    0xC0 | 0xA8 | 0x01 | 0x02
// 192 . 168 . 1 . 2

inet_addr("192.168.1.1")htonl() 返回

    0xC0 | 0xA8 | 0x01 | 0x01
// 192 . 168 . 1 . 1

那么差值将等于 1

      addr1.sin_addr.s_addr = htonl(inet_addr("192.168.1.1"));
addr2.sin_addr.s_addr = htonl(inet_addr("192.168.1.2"));
addr3.sin_addr.s_addr = htonl(inet_addr("192.168.1.3"));
addr4.sin_addr.s_addr = htonl(inet_addr("192.168.1.255"));
addr5.sin_addr.s_addr = htonl(inet_addr("192.168.2.1"));

关于c - in_addr_t,从一个IP跳转到下一个IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21725751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com