Objective-C:检查OSX中的防火墙状态?

时间:2011-01-15 11:35:54

标签: objective-c cocoa macos firewall

我的objective-c应用程序需要知道OSX中的防火墙是否正在运行,因此它可以告诉用户将其关闭或创建新规则。

此外,是否可以直接从我的应用创建规则,以便用户永远不需要处理网络问题?

约翰

2 个答案:

答案 0 :(得分:4)

我正在编写一个函数,它将为您提供OSX防火墙的状态:)

-(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;
}

答案 1 :(得分:1)

如果您的应用程序由用户运行(即在Finder中双击),则应用程序创建套接字侦听器的任何尝试都将提示用户允许/拒绝该侦听器 - 并随后调整防火墙设置相应地 - 您的申请没有任何程序性干预。

如果有问题的防火墙是您的路由器(我最近不得不处理的问题),您有几个选择。最好的支持选项是Bonjour / mDNSResponder(只要你不想支持双重自然的情况)。 Apple围绕相当钝的dns_sd.h提供了一个Objective-C包装器应用程序:

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

走第三方路线,看看TCM Port Mapper。它使用了一些不推荐使用的功能,并且需要花费一些精力才能让它在ARC支持下运行(如果这对你很重要)。

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

两者都支持UPnP和NAT-PMP。

最后,如果您的应用程序作为守护程序运行(没有用户界面),那么您将不得不熟悉ipfw。振作起来。 Google为“ipfw os x”。 StackOverflow阻止我发布两个以上的链接。辉煌。

希望这会有所帮助......