如何使用NSHost获取外部IP地址?

时间:2009-05-31 11:45:33

标签: objective-c cocoa

我正在尝试找到我的外部IP地址,但我只在NAT后面获得本地IP地址。

NSArray *addresses = [[NSHost currentHost] addresses];

有没有办法打印公共地址?使用NSHost是一个好主意吗?

3 个答案:

答案 0 :(得分:11)

可能并不总是有可靠的方法来获取您的公共IP,但OS X中的DNSService API将使用UPnP和/或NAT端口映射协议来获取公共IP(以及其他内容)。说明如何使用C API的代码有点大(50-60行),但是有一些Apple示例代码实现了一个很好的ObjC包装功能,甚至提供了一对函数来直接返回公共IP地址的UInt32和NSString表示。

相关代码本身is located here,但您可能最好只下载zip文件并在项目中包含PortMapper.h和PortMapper.m并直接使用它们。那么你需要做的就是:

NSString * publicAddressString = [PortMapper findPublicAddress];

答案 1 :(得分:2)

如果您要查看主要组织的网络拓扑图,请执行此操作。这很有启发性。 NAT,防火墙以及所有其他“黑魔法”的全部意义在于让网络在您不知情的情况下管理地址(包括保护您)。

我只能通过三种方式可靠地(并且可靠的是这里的相对概念)获取服务器的面向外部的IP地址。

第一个是作为网络神自己(并确保在询问时将它们称为神,这将帮助您获取信息)。有时(并非总是),它是IP地址的顶部字节的简单映射,同时保留低位字节。有时它更复杂,但仍然遵循您可以使用的规则。请记住,这些规则可以随时更改。

第二种方法是在网络外部放置一个可以查询的方框,然后它可以让您知道您的IP地址。

第三种是专门附加到外部DNS服务器(不是您的公司服务器)来检索信息。

当然,您应该询问 need 以了解您的外部IP地址。 DNS的重点是避免过多担心IP地址,只需通过域名引用机器。

答案 2 :(得分:1)

没有可靠的方法来获取您的公共IP。根据您的网络拓扑结构,您可能无法依赖传出地址,原因有很多:IP地址池,动态路由,多层NAT,代理服务器等。

相关问题