2011-09-26 6 views
5

Tôi có IP như sau: 12.12.12.12
Tôi đang lặp qua các dải IP khác nhau (theo định dạng 12.12.12.0/24 (ví dụ)) và cố gắng xem IP có nằm trong phạm vi.
Tôi đã thử các phương pháp khác nhau như inet_addr và so sánh nhưng tôi dường như không thể nhận được nó.
Có cách nào dễ dàng để thực hiện việc này không? Tôi đang sử dụng Windows.IP nằm trong phạm vi CIDR

+0

liên quan: http://stackoverflow.com/questions/1507579/how- có thể-i-xác định-đó-người dùng-ip-địa chỉ-là-trong-có thể truy cập-phạm vi-hoặc-không –

+0

Đó là PHP, như bạn có thể thấy từ các thẻ tôi đang sử dụng C++ – seth

Trả lời

6

Chỉ cần kiểm tra xem:

(ip & netmask) == (range & netmask) 

Bạn có thể xác định mặt nạ mạng từ CIDR thông số range/netbits như sau:

uint32_t netmask = ~(~uint32_t(0) >> netbits); 
+1

chuyển đổi 'ntohl' có thể được yêu cầu trước khi thực hiện việc này. – KillianDS

+0

@KillianDS: Tôi giả định rằng quá trình phân tích cú pháp tạo ra một địa chỉ theo thứ tự byte cục bộ, nhưng bạn nói đúng, đó là điều cần kiểm tra lại, đặc biệt là vì 'inet_addr' trả về thứ tự byte mạng. –

+0

Bạn có thấy điều gì sai ở đây không? Dường như in cho từng chữ cái duy nhất: 'int cidr = atoi (cdrbuf); \t \t unsigned long ulstart = ntohl (inet_addr (clip)); \t \t unsigned long ulcheck = ntohl (inet_addr ("12.12.12.12")); \t \t mặt nạ dài chưa được ký = ~ unsigned long (~ 0ULL >> cidr); \t \t if ((ulcheck & netmask) == (cidr & netmask)) \t \t \t printf ("% s \ n", pch); ' – seth

2

Lấy biểu diễn nhị phân và loại bỏ những gì không phù hợp với mặt nạ mạng của bạn.

Làm rõ: Hãy nói rằng bạn có IP a.b.c.d và muốn để phù hợp với nó để e.f.g.h/i sau đó, bạn có thể ném IP vào một số nguyên unsigned, uint32_t ip = a<<24 + b<<16 + c<<8 + d và làm tương tự với uint32_t range = e<<24 + f<<16 + g<<8 + h. Bây giờ bạn có thể sử dụng mặt nạ mạng của mình: uint32_t mask = (~0u) << (32-i). Bây giờ, bạn có thể chỉ cần kiểm tra xem ip "có đang ở" range hay không bằng cách so sánh chúng: ip & mask == range & mask.

+0

Lặp đi lặp lại rõ ràng đến từ thử nghiệm chống lại một toàn bộ mớ hỗn độn. –

+0

@Ben Voigt: Tôi phải bỏ lỡ điều đó. Bạn đúng. – bitmask