2010-01-07 107 views
11

Tôi có mã cho phép tôi xác định địa chỉ MAC và địa chỉ IP của kết nối WiFi trên iPhone, nhưng tôi không thể tìm ra cách lấy Subnet Mask và địa chỉ Router sự kết nối. Có ai có thể chỉ cho tôi đi đúng hướng không?Mặt nạ mạng và mặt nạ mạng WiFi của iPhone

+0

Hiện tại tôi đang xem ICMP (yêu cầu bộ định tuyến) hoặc ICMP (yêu cầu echo, 1 hop, xem ai trả lời). Tôi không nghĩ rằng bộ định tuyến của tôi phản hồi yêu cầu ICMP của bộ định tuyến; phương pháp thứ hai là cách traceroute hoạt động (tôi tin). Một tùy chọn khác sẽ là một DHCP API (không thể tìm thấy một trên Iphone) hoặc gửi gói tin DHCP cho thông tin (vì trong trường hợp của tôi sẽ luôn có DHCP và router luôn là máy chủ DHCP). – Bill

+0

FYI - Ứng dụng iPhone được thiết kế để kiểm soát các chính sách bảo mật/truy cập trên các bộ định tuyến DL Home Home NAT (giao diện Web là một cơn đau để sử dụng); Tôi chỉ đơn giản là cố gắng tránh làm cho người dùng gõ vào địa chỉ của router. Họ sẽ phải cung cấp mật khẩu, do đó, không có vấn đề lớn nếu tôi không thể tìm thấy một giải pháp tốt ở đây. – Bill

+0

@bvanderw - bạn có thể đăng liên kết tới mã của bạn hoặc tài liệu để xác định địa chỉ MAC của kết nối WiFi không? Tôi đã không thể theo dõi nó xuống. – Ciaran

Trả lời

13

Bạn có thể nhận thông tin đó bằng cách gọi getifaddrs. (Tôi sử dụng chức năng này trong một ứng dụng của tôi để tìm ra địa chỉ IP của iPhone.)

struct ifaddrs *ifa = NULL, *ifList; 
getifaddrs(&ifList); // should check for errors 
for (ifa = ifList; ifa != NULL; ifa = ifa->ifa_next) { 
    ifa->ifa_addr // interface address 
    ifa->ifa_netmask // subnet mask 
    ifa->ifa_dstaddr // broadcast address, NOT router address 
} 
freeifaddrs(ifList); // clean up after yourself 

Điều này mang lại cho bạn mặt nạ mạng con; cho the router address, see this question.

Đây là tất cả các công cụ mạng UNIX cũ, bạn sẽ phải chọn giao diện nào là kết nối WiFi (các công cụ khác như giao diện loopback cũng có trong đó). Sau đó, bạn có thể phải sử dụng các hàm như inet_ntoa() tùy thuộc vào định dạng bạn muốn đọc địa chỉ IP. Nó không tệ, chỉ tẻ nhạt và xấu xí. Chúc vui vẻ!

+0

ifa-> ifa_dstaddr là địa chỉ quảng bá chứ không phải địa chỉ của bộ định tuyến. – Bill

+2

@Bill: đã trả lời câu trả lời của tôi, vui lòng xem xét lại ý kiến ​​của bạn. – benzado

+0

bạn sẽ cần nhập ifaddrs.h –

3
NSString *address = @"error"; 
NSString *netmask = @"error"; 
struct ifaddrs *interfaces = NULL; 
struct ifaddrs *temp_addr = NULL; 
int success = 0; 

// retrieve the current interfaces - returns 0 on success 
success = getifaddrs(&interfaces); 
if (success == 0) 
{ 
    // Loop through linked list of interfaces 
    temp_addr = interfaces; 
    while(temp_addr != NULL) 
    { 
     if(temp_addr->ifa_addr->sa_family == AF_INET) 
     { 
      // Check if interface is en0 which is the wifi connection on the iPhone 

      if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) 
      { 
       // Get NSString from C String 
       address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; 
       netmask = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)]; 
      } 
     } 

     temp_addr = temp_addr->ifa_next; 
    } 
} 

// Free memory 
freeifaddrs(interfaces); 
NSLog(@"address %@", address); 
NSLog(@"netmask %@", netmask); 
Các vấn đề liên quan