我的Objective-C应用需要知道OSX防火墙是否正在运行,以便告诉用户关闭它或创建新规则。
此外,我的应用程序是否可以直接创建规则,使用户永远不需要处理网络问题?
约翰
我的Objective-C应用需要知道OSX防火墙是否正在运行,以便告诉用户关闭它或创建新规则。
此外,我的应用程序是否可以直接创建规则,使用户永远不需要处理网络问题?
约翰
我正在编写一个函数,可以提供您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;
}
如果用户运行您的应用程序(即在查找器中双击),则您的应用程序尝试创建套接字侦听器将提示用户允许/拒绝该侦听器,并相应地调整防火墙设置 - 您的应用程序不需要进行任何编程干预。
如果涉及的防火墙是您的路由器(最近我处理过的一个问题),您有几个选项。 最好支持的选择是Bonjour / mDNSResponder(只要您不想支持双NAT的情况)。 Apple提供了一个Objective-C包装器应用程序,可以围绕相当深奥的dns_sd.h:
如果你想选择第三方路线,可以看看 TCM Port Mapper。它使用了一些已弃用的功能,如果你需要 ARC 支持的话,可能需要花费一些努力才能使其运行。
http://code.google.com/p/tcmportmapper/
两者都支持UPnP和NAT-PMP。
最后,如果您的应用程序作为守护进程运行(没有用户界面),那么您将不得不熟悉ipfw。做好准备。在Google上搜索“ipfw os x”。StackOverflow阻止我发布超过两个链接。太棒了。
希望这可以帮助到您....