c计算所有可能的子网

c计算所有可能的子网,c,networking,mask,C,Networking,Mask,我正在尝试使用我的网络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

我正在尝试使用我的网络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???

}
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(~\u掩码);/=255
对于(inti=0;i核心概念

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.]

假设您想保留现有的代码(这是一个很大的假设),请记住
\u net
\u mask
都仍然处于网络顺序,因此您的OR'd in子地址也需要保留

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);

}

在进入循环之前打印
\u net
\u mask
可能会对您的问题有所帮助。或者更好的是,调试器可能会提供同样的信息。考虑到此代码不会编译,这并不会使它变得更容易。使用您提供的代码,我得到了输出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等。如果您没有收到此输出,请更新您的问题以提供更多信息。我收到了相同的输出,但应该是192.168.1.0、192.168.1.1、192.168.1.2…192.168.1.255听起来像是big-endian vs.little-endian哦,我不知道htonl的存在。我正在尝试类似于\u addr\t子网中的
(_mask&_net)|它是
ntohl()
的正反面。此外,如果上面的代码在
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 );
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