Ç计算所有可能的子网

问题描述:

我试图计算出所有可能的子网与我的网络IP和掩码:Ç计算所有可能的子网

char *net = "192.168.1.0" 
char *mask = "255.255.255.0" 

in_addr_t _net = inet_addr(net); 
in_addr_t _mask = inet_addr(mask); 
int possibleHosts = ntohl(~_mask); // = 255 


for (int i=0; i<possibleHosts; i++) { //From 0 to 255 
    in_addr_t subnet = (_mask & _net) | i; // should calculate the subnets from 192.168.1.0 to 192.168.1.255 
    struct in_addr in; 
    in.s_addr = subnet; 
    char *test = inet_ntoa(in); 
    printf("%s\n", test); //always prints 192.168.1.0??? 

} 

但产量始终是“192.168.1.0”。有谁知道为什么?

+0

也许打印'_net'和'_mask'在进入你的循环您的问题将一些启发。或者更好的是,也许一个*调试器*就像信息一样。考虑到这个代码不会*编译*不会让它变得更容易。 – WhozCraig 2013-04-22 19:38:09

+0

您提供的代码,我得到的输出192.168.1.0 193.168.1.0 194.168.1.0 195.168.1.0 196.168.1.0 197.168.1.0 198.168.1.0等等。如果你没有得到这个输出,请更新您的问题更具信息性。 – 2013-04-22 19:41:12

+0

我收到相同的输出,但它应该是192.168.1.0,192.168.1.1,192.168.1.2 ... 192.168.1.255 – wasp256 2013-04-22 19:47:06

假设你要保持你现有的代码(和多数民众赞成在一个大的假设),请记住,_net_mask都仍然是网络顺序,所以你在子地址OR'D需要是W埃尔。

const char *net = "192.168.1.0"; 
const char *mask = "255.255.255.0"; 

in_addr_t _net = inet_addr(net); 
in_addr_t _mask = inet_addr(mask); 
int possibleHosts = ntohl(~_mask); 


for (int i=0; i<possibleHosts; i++) 
{ 
    in_addr_t subnet = (_mask & _net) | htonl(i); // <<== must be network-order 
    struct in_addr in; 
    in.s_addr = subnet; 
    char *test = inet_ntoa(in); 
    printf("%s\n", test); 

} 

输出

192.168.1.0 
192.168.1.1 
192.168.1.2 
192.168.1.3 
192.168.1.4 
192.168.1.5 
192.168.1.6 
192.168.1.7 
192.168.1.8 
192.168.1.9 
192.168.1.10 
192.168.1.11 
192.168.1.12 
192.168.1.13 
192.168.1.14 
192.168.1.15 
192.168.1.16 
192.168.1.17 
192.168.1.18 
192.168.1.19 
192.168.1.20 
192.168.1.21 
192.168.1.22 
192.168.1.23 
192.168.1.24 
192.168.1.25 
192.168.1.26 
192.168.1.27 
192.168.1.28 
192.168.1.29 
192.168.1.30 
192.168.1.31 
192.168.1.32 
192.168.1.33 
192.168.1.34 
192.168.1.35 
192.168.1.36 
192.168.1.37 
192.168.1.38 
192.168.1.39 
192.168.1.40 
192.168.1.41 
192.168.1.42 
192.168.1.43 
192.168.1.44 
192.168.1.45 
192.168.1.46 
192.168.1.47 
192.168.1.48 
192.168.1.49 
192.168.1.50 
192.168.1.51 
192.168.1.52 
192.168.1.53 
192.168.1.54 
192.168.1.55 
192.168.1.56 
192.168.1.57 
192.168.1.58 
192.168.1.59 
192.168.1.60 
192.168.1.61 
192.168.1.62 
192.168.1.63 
192.168.1.64 
192.168.1.65 
192.168.1.66 
192.168.1.67 
192.168.1.68 
192.168.1.69 
192.168.1.70 
192.168.1.71 
192.168.1.72 
192.168.1.73 
192.168.1.74 
192.168.1.75 
192.168.1.76 
192.168.1.77 
192.168.1.78 
192.168.1.79 
192.168.1.80 
192.168.1.81 
192.168.1.82 
192.168.1.83 
192.168.1.84 
192.168.1.85 
192.168.1.86 
192.168.1.87 
192.168.1.88 
192.168.1.89 
192.168.1.90 
192.168.1.91 
192.168.1.92 
192.168.1.93 
192.168.1.94 
192.168.1.95 
192.168.1.96 
192.168.1.97 
192.168.1.98 
192.168.1.99 
192.168.1.100 
192.168.1.101 
192.168.1.102 
192.168.1.103 
192.168.1.104 
192.168.1.105 
192.168.1.106 
192.168.1.107 
192.168.1.108 
192.168.1.109 
192.168.1.110 
192.168.1.111 
192.168.1.112 
192.168.1.113 
192.168.1.114 
192.168.1.115 
192.168.1.116 
192.168.1.117 
192.168.1.118 
192.168.1.119 
192.168.1.120 
192.168.1.121 
192.168.1.122 
192.168.1.123 
192.168.1.124 
192.168.1.125 
192.168.1.126 
192.168.1.127 
192.168.1.128 
192.168.1.129 
192.168.1.130 
192.168.1.131 
192.168.1.132 
192.168.1.133 
192.168.1.134 
192.168.1.135 
192.168.1.136 
192.168.1.137 
192.168.1.138 
192.168.1.139 
192.168.1.140 
192.168.1.141 
192.168.1.142 
192.168.1.143 
192.168.1.144 
192.168.1.145 
192.168.1.146 
192.168.1.147 
192.168.1.148 
192.168.1.149 
192.168.1.150 
192.168.1.151 
192.168.1.152 
192.168.1.153 
192.168.1.154 
192.168.1.155 
192.168.1.156 
192.168.1.157 
192.168.1.158 
192.168.1.159 
192.168.1.160 
192.168.1.161 
192.168.1.162 
192.168.1.163 
192.168.1.164 
192.168.1.165 
192.168.1.166 
192.168.1.167 
192.168.1.168 
192.168.1.169 
192.168.1.170 
192.168.1.171 
192.168.1.172 
192.168.1.173 
192.168.1.174 
192.168.1.175 
192.168.1.176 
192.168.1.177 
192.168.1.178 
192.168.1.179 
192.168.1.180 
192.168.1.181 
192.168.1.182 
192.168.1.183 
192.168.1.184 
192.168.1.185 
192.168.1.186 
192.168.1.187 
192.168.1.188 
192.168.1.189 
192.168.1.190 
192.168.1.191 
192.168.1.192 
192.168.1.193 
192.168.1.194 
192.168.1.195 
192.168.1.196 
192.168.1.197 
192.168.1.198 
192.168.1.199 
192.168.1.200 
192.168.1.201 
192.168.1.202 
192.168.1.203 
192.168.1.204 
192.168.1.205 
192.168.1.206 
192.168.1.207 
192.168.1.208 
192.168.1.209 
192.168.1.210 
192.168.1.211 
192.168.1.212 
192.168.1.213 
192.168.1.214 
192.168.1.215 
192.168.1.216 
192.168.1.217 
192.168.1.218 
192.168.1.219 
192.168.1.220 
192.168.1.221 
192.168.1.222 
192.168.1.223 
192.168.1.224 
192.168.1.225 
192.168.1.226 
192.168.1.227 
192.168.1.228 
192.168.1.229 
192.168.1.230 
192.168.1.231 
192.168.1.232 
192.168.1.233 
192.168.1.234 
192.168.1.235 
192.168.1.236 
192.168.1.237 
192.168.1.238 
192.168.1.239 
192.168.1.240 
192.168.1.241 
192.168.1.242 
192.168.1.243 
192.168.1.244 
192.168.1.245 
192.168.1.246 
192.168.1.247 
192.168.1.248 
192.168.1.249 
192.168.1.250 
192.168.1.251 
192.168.1.252 
192.168.1.253 
192.168.1.254 
+0

哦,男人,我不知道htonl存在。我正在尝试诸如'in_addr_t subnet =(_mask&_net)|之类的东西我 2013-04-22 20:01:31

+0

它是'ntohl()'的反正。此外,如果上面的代码使用'in_adder_t'作为'i',它甚至会是便携式的(就像听起来那样扭曲)。 – WhozCraig 2013-04-22 20:03:54

+0

perfekt它的工作原理,非常感谢! – wasp256 2013-04-22 20:05:27

核心理念

mask32 = 0xFFFFFFFF = (~0 << 0); 
mask31 = 0xFFFFFFFE = (~0 << 1); 
mask30 = 0xFFFFFFFB = (~0 << 2); 

mask01 = 0x00000000 = (~0 << 31); 

[Note: ~0 means inverting all bits of 0, i.e. 0xFFFFFFFF. "<<" means left bit shift.] 

uint32_t mask[ 33 ]; 
for i = 1 to 32: 
    mask[i] = ~0 << (32 - i); 

附加

// A function to convert mask from number format to string format. 
// See http://www.allredroster.com/iptodec.htm for reference 
// Example: maskAsString(0xC0A80100) --> "192.168.1.0" 
char const * maskAsString(uint32_t mask); 

// .. and also the inverse function 
uint32_t stringAsMask(char const * maskString);