6

我有一小段代码将一个 32 位无符号整数(即:)uint32_t转换为一组四个 8 位字段,将其视为 IP 地址,然后如果它落在预定范围内则向客户端报告IP 地址。

我已经在 C 中找到了一些不同的代码示例,这些示例向我展示了如何从struct sockaddr_in包含它的客户端获取 IP 地址以及C# 答案。但是,我想进一步分解地址,将其保留在纯 C 中,并想知道一些快速的事情:

  1. 系统之间的内部表示是否一致,或者我是否需要在现场进行字节序检查/更正s_addr
  2. 是否有标准的宏CLASS_C_NETMASK,例如,比使用手动生成的掩码(即: 、等)CLASS_B_NETMASK更合适。0xFF0000000x00FF0000
  3. 套接字库中是否有任何现有函数可以检查 IP 地址是否在 IP 地址范围内或与子网掩码匹配?

谢谢。

4

1 回答 1

17

系统之间的内部表示是否一致,或者我是否需要对 s_addr 字段进行字节序检查/更正?

s_addr在所有平台上始终采用网络(大端)字节顺序。

是否存在 CLASS_C_NETMASK、CLASS_B_NETMASK 等标准宏,它们比使用手动生成的掩码更合适(即:0xFF000000、0x00FF0000 等)。

不,使用这样的宏也没有意义,因为子网掩码不是从一个网络固定到另一个网络。您需要为您的代码提供一个实际的网络 IP 及其子网掩码(提示用户、查询操作系统等)。然后,您可以计算子网的起始 IP 和结束 IP,以与您的目标 IP 进行比较:

uint32_t ip = ...; // value to check
uint32_t netip = ...; // network ip to compare with
uint32_t netmask = ...; // network ip subnet mask
uint32_t netstart = (netip & netmask); // first ip in subnet
uint32_t netend = (netstart | ~netmask); // last ip in subnet
if ((ip >= netstart) && (ip <= netend))
    // is in subnet range...
else
    // not in subnet range...

或者更简单,用子网掩码屏蔽网络 IP 和目标 IP,看看结果值是否相同(即它们是同一个子网):

uint32_t ip = ...; // value to check
uint32_t netip = ...; // network ip to compare with
uint32_t netmask = ...; // network ip subnet mask
if ((netip & netmask) == (ip & netmask))
    // is on same subnet...
else
    // not on same subnet...

套接字库中是否有任何现有函数可以检查 IP 地址是否在 IP 地址范围内或与子网掩码匹配?

不需要。但是手动实现很简单,只需要几行代码,如上图。

于 2015-06-25T04:17:59.813 回答