系统之间的内部表示是否一致,或者我是否需要对 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 地址范围内或与子网掩码匹配?
不需要。但是手动实现很简单,只需要几行代码,如上图。