我可以通过using this question's answer获取我正在使用的设备/机器的当前IP地址。
我经历了this question。 Java允许从域名获取IP地址。在Objective C中有可能吗?怎么样?
第二个问题是如何使用其IP地址获取设备/机器的名称。比方说我有一个IP地址192.168.0.74 =什么是设备名称?目标C?
答案 0 :(得分:4)
我不确定这是否是最好的方法,但它主要适用于我。我输入了StackOverflow的IP地址(69.59.196.211),它给了我stackoverflow.com
,但是我输入了一个谷歌的IP地址(210.55.180.158),它给了我cache.googlevideo.com
(所有结果) ,而不仅仅是第一个。)
int error;
struct addrinfo *results = NULL;
error = getaddrinfo("69.59.196.211", NULL, NULL, &results);
if (error != 0)
{
NSLog (@"Could not get any info for the address");
return; // or exit(1);
}
for (struct addrinfo *r = results; r; r = r->ai_next)
{
char hostname[NI_MAXHOST] = {0};
error = getnameinfo(r->ai_addr, r->ai_addrlen, hostname, sizeof hostname, NULL, 0 , 0);
if (error != 0)
{
continue; // try next one
}
else
{
NSLog (@"Found hostname: %s", hostname);
break;
}
}
freeaddrinfo(results);
地址可以有多个名称,因此您可能不想在找到的第一个名称停留。
答案 1 :(得分:1)
我对接受的答案写了Swift版本,尽管我不确定它的正确性。
func reverseDNS(ip: String) -> String {
var results: UnsafeMutablePointer<addrinfo>? = nil
defer {
if let results = results {
freeaddrinfo(results)
}
}
let error = getaddrinfo(ip, nil, nil, &results)
if (error != 0) {
print("Unable to reverse ip: \(ip)")
return ip
}
for addrinfo in sequence(first: results, next: { $0?.pointee.ai_next }) {
guard let pointee = addrinfo?.pointee else {
print("Unable to reverse ip: \(ip)")
return ip
}
let hname = UnsafeMutablePointer<Int8>.allocate(capacity: Int(NI_MAXHOST))
defer {
hname.deallocate()
}
let error = getnameinfo(pointee.ai_addr, pointee.ai_addrlen, hname, socklen_t(NI_MAXHOST), nil, 0, 0)
if (error != 0) {
continue
}
return String(cString: hname)
}
return ip
}
答案 2 :(得分:0)
您需要阅读路由表 - 基本上与“netstat -r”命令相同。 netstat实现是opensource - 它在包
中network_cmds-396.6
在
http://www.opensource.apple.com/release/mac-os-x-1082/
所以你可以查看它的作用。默认网关包含“G”标志,但不应连接“I”标志(当wifi和单元都处于活动状态时,wifi用于互联网连接 - 不使用单元网关并给出“I”标志)
希望它有所帮助。