2011-01-15 27 views
5

Ứng dụng mục tiêu c của tôi cần phải biết nếu tường lửa trong OSX đang chạy, vì vậy nó có thể yêu cầu người dùng tắt hoặc tạo quy tắc mới.Mục tiêu-C: Kiểm tra trạng thái tường lửa trong OSX?

Ngoài ra, có thể tạo các quy tắc trực tiếp từ ứng dụng của tôi để người dùng không bao giờ cần xử lý các sự cố mạng không?

John

+0

gì nếu các bức tường lửa là trên một router? Người dùng của bạn sẽ chỉ phải tự mình xử lý tường lửa. –

Trả lời

1

Nếu ứng dụng của bạn đang được chạy bởi người sử dụng (ví dụ, nhấn đúp chuột trong Finder), bất kỳ nỗ lực của ứng dụng của bạn để tạo ra một người biết lắng nghe socket sẽ nhắc nhở người dùng để cho phép/từ chối nghe rằng - và sau đó điều chỉnh cài đặt tường lửa cho phù hợp - mà không cần bất kỳ sự can thiệp có lập trình nào vào phần ứng dụng của bạn.

Nếu tường lửa được đề cập là bộ định tuyến của bạn (một vấn đề mà gần đây tôi phải đối phó), bạn có một vài tùy chọn. Tùy chọn được hỗ trợ tốt nhất là Bonjour/mDNSResponder (miễn là bạn không muốn hỗ trợ tình huống hai lần). Apple cung cấp một ứng dụng wrapper Objective-C xung quanh dns_sd.h khá tù:

http://developer.apple.com/library/mac/#samplecode/PortMapper/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007879-Intro-DontLinkElementID_2

Đi con đường bên thứ 3, hãy nhìn vào TCM Port Mapper. Nó sử dụng một số tính năng không được chấp nhận và nó sẽ mất một chút nỗ lực để làm cho nó chạy với hỗ trợ ARC (nếu điều đó quan trọng đối với bạn).

http://code.google.com/p/tcmportmapper/

Cả hai hỗ trợ UPnP và NAT-PMP.

Cuối cùng, nếu ứng dụng của bạn đang chạy như một daemon (không có giao diện người dùng), bạn sẽ phải làm quen với ipfw. Brace mình. Google cho "ipfw os x". StackOverflow đang ngăn tôi đăng nhiều hơn hai liên kết. Rực rỡ.

Hope this helps ....

4

Tôi viết một chức năng mà sẽ cung cấp cho bạn tình trạng của OSX tường lửa :)

-(BOOL)getFirewallStatus{ 


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSSystemDomainMask, YES); 

    NSString *path = [paths objectAtIndex:0]; 

    path = [NSString stringWithFormat:@"%@/%@",path,@"Preferences/com.apple.alf.plist"]; 

    path = [path stringByReplacingOccurrencesOfString:@"/System" 
              withString:@""]; 




    NSDictionary* _dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 


    // firewall status 
    int status = [[_dictionary valueForKey:@"globalstate"] integerValue]; 

    if (status == 0) 
    { 
     return NO; 
    } 

    return YES; 
} 
Các vấn đề liên quan