#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
// 將點分十進制的 IP 地址轉換為 32 位無符號整數
unsigned int ip_to_uint(const char *ip) {
? ? struct in_addr addr;
? ? if (inet_pton(AF_INET, ip, &addr) <= 0) {
? ? ? ? fprintf(stderr, "Invalid IP address: %s\n", ip);
? ? ? ? return 0;
? ? }
? ? return ntohl(addr.s_addr);
}
// 判斷兩個 IP 地址是否在同一子網
int is_same_subnet(const char *ip1, const char *ip2, const char *subnet_mask) {
? ? unsigned int ip1_int = ip_to_uint(ip1);
? ? unsigned int ip2_int = ip_to_uint(ip2);
? ? unsigned int mask_int = ip_to_uint(subnet_mask);
? ? if (ip1_int == 0 || ip2_int == 0 || mask_int == 0) {
? ? ? ? return 0;
? ? }
? ? // 計算網絡地址
? ? unsigned int network1 = ip1_int & mask_int;
? ? unsigned int network2 = ip2_int & mask_int;
? ? return network1 == network2;
}
int main() {
? ? const char *ip1 = "192.168.1.100";
? ? const char *ip2 = "192.168.1.200";
? ? const char *subnet_mask = "255.255.255.0";
? ? if (is_same_subnet(ip1, ip2, subnet_mask)) {
? ? ? ? printf("%s 和 %s 屬于同一子網。\n", ip1, ip2);
? ? } else {
? ? ? ? printf("%s 和 %s 不屬于同一子網。\n", ip1, ip2);
? ? }
? ? return 0;
}?