我如何获得本地IpAddress?
当我使用该功能时,getifaddrs()
我将无法再继续使用。我不能使用该功能。
是否有其他方法可以执行此操作,或者我是否以错误的方式进行操作?
在讨论中发现,OP需要Mac上的接口地址,而不是我最初想的那样在iOS设备上。问题中引用的代码将检查接口名称“en0”,它是iPhone上的WiFi接口。在Mac上,改为检查任何“正在运行”的界面更有意义。因此,我重写了答案。现在,它是“检测任何连接的网络”中代码的快速翻译 。
getifaddrs()
在中定义<ifaddrs.h>
,默认情况下不包含。因此,您必须创建一个桥接头并添加
#include <ifaddrs.h>
以下函数返回一个数组,其中包含所有本地“正在运行的”网络接口的名称。
func getIFAddresses() -> [String] {
var addresses = [String]()
// Get list of all interfaces on the local machine:
var ifaddr : UnsafeMutablePointer<ifaddrs> = nil
if getifaddrs(&ifaddr) == 0 {
// For each interface ...
var ptr = ifaddr
while ptr != nil {
defer { ptr = ptr.memory.ifa_next }
let flags = Int32(ptr.memory.ifa_flags)
let addr = ptr.memory.ifa_addr.memory
// Check for running IPv4, IPv6 interfaces. Skip the loopback interface.
if (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) {
if addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6) {
// Convert interface address to a human readable string:
var hostname = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0)
if (getnameinfo(ptr.memory.ifa_addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count),
nil, socklen_t(0), NI_NUMERICHOST) == 0) {
if let address = String.fromCString(hostname) {
addresses.append(address)
}
}
}
}
}
freeifaddrs(ifaddr)
}
return addresses
}
Swift 3的更新: 除了 对Swift 3 的许多更改采用代码之外 ,对所有接口进行迭代现在还可以使用新的通用
sequence()
函数:
func getIFAddresses() -> [String] {
var addresses = [String]()
// Get list of all interfaces on the local machine:
var ifaddr : UnsafeMutablePointer<ifaddrs>?
guard getifaddrs(&ifaddr) == 0 else { return [] }
guard let firstAddr = ifaddr else { return [] }
// For each interface ...
for ptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
let flags = Int32(ptr.pointee.ifa_flags)
let addr = ptr.pointee.ifa_addr.pointee
// Check for running IPv4, IPv6 interfaces. Skip the loopback interface.
if (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) {
if addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6) {
// Convert interface address to a human readable string:
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
if (getnameinfo(ptr.pointee.ifa_addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count),
nil, socklen_t(0), NI_NUMERICHOST) == 0) {
let address = String(cString: hostname)
addresses.append(address)
}
}
}
}
freeifaddrs(ifaddr)
return addresses
}
问题内容: 我想获取计算机的IP地址。我使用了下面的代码,但是返回了。 我想获取IP地址(例如),而不是回送地址。 问题答案: 您需要遍历所有网络接口 播放(取自util / helper.go)
问题内容: 我不是指 127.0.0.1 而是其他计算机将用来访问该计算机的计算机,例如 192.168.1.6 问题答案: http://nodejs.org/api/os.html#os_os_networkinterfaces
问题内容: 如何在Django中获取用户的IP? 我有这样的看法: 但是我得到这个错误: 问题答案: 确保正确配置了反向代理(如果有)(例如,为Apache安装)。 注意:上面使用的第一项,但是你可能想使用最后一项(例如,在Heroku的情况下:在Heroku上获取客户端的真实IP地址) 然后将请求作为参数传递给它;
我想展示一个IP的两个第一范围。例如,我127.0.0.1。我想得到127.0并使用这个例子: show show 我怎么能那样做? 我尝试了,但它显示了整个IP地址。
我写了一个小的协议栈来连接KNX/IP路由器。机制如下: null
但是,这给了我127.0.1.1的IP地址。当我使用时,我得到以下信息 首先,我不知道127.0.1.1是从哪里来的,但不管怎样,这都不是我想要的。当我谷歌的时候,我总是看到相同的语法,Bash脚本或netifaces,我试图使用标准库。 那么如何在Python中获取eth0的IP地址呢?