转换的一个选项可能是:
IN_ADDR NetMask;
NetMask.S_un.S_addr = PrefixLength ? (0xFFFFFFFF >> (32 - PrefixLength)) : 0;
但是有更标准/可移植的方式吗?
答案 0 :(得分:1)
这不适用于不是8的幂的前缀长度。考虑长度为20,您需要0xF0FFFF(网络顺序)。这意味着你会想做这样的事情:
PrefixLength ? htonl(~((1 << (32 - PrefixLength)) - 1)) : 0
或者看this answer。但是你需要一个htonl调用或者一个比简单移位更复杂的东西来获得网络顺序的网络掩码。
答案 1 :(得分:0)
没关系,只要你使常数无符号,所以右移是明确定义的:
NetMask.S_un.S_addr = PrefixLength ? (0xFFFFFFFFu >> (32 - PrefixLength)) : 0;