40 lines
1.2 KiB
C
40 lines
1.2 KiB
C
#include <stdio.h>
|
|
#include <arpa/inet.h>
|
|
|
|
void network4(const char* network, int prefix) {
|
|
struct in_addr inaddr;
|
|
// Convert from human view to network bytes
|
|
if (inet_pton(AF_INET, network, &inaddr) == 0) {
|
|
printf("Invalid IP address\n");
|
|
return;
|
|
}
|
|
// Convert from network bytes to local
|
|
uint32_t ip = ntohl(inaddr.s_addr);
|
|
|
|
// Calculate mask and net
|
|
uint32_t mask = (prefix == 0) ? 0 : (~0U << (32 - prefix));
|
|
uint32_t net = ip & mask;
|
|
uint32_t fip = net + 1;
|
|
|
|
// Convert net address bytes to network order
|
|
struct in_addr net_addr;
|
|
net_addr.s_addr = htonl(net);
|
|
// Convert mask bytes to network order
|
|
struct in_addr mask_addr;
|
|
mask_addr.s_addr = htonl(mask);
|
|
// Convert mask bytes to network order
|
|
struct in_addr fip_addr;
|
|
fip_addr.s_addr = htonl(fip);
|
|
|
|
printf("IP: %s/%d\n", network, prefix);
|
|
printf("Netmask: %s\n", inet_ntoa(mask_addr));
|
|
printf("Network: %s\n", inet_ntoa(net_addr));
|
|
printf("First: %s\n", inet_ntoa(fip_addr));
|
|
}
|
|
|
|
int main() {
|
|
network4("192.168.1.154", 26);
|
|
return 0;
|
|
}
|
|
|