我想编写一个函数来检查主机名是否可以在特定的端口上访问。所以,像:
func isReachable(hostname: String, port: Int, completion: (Bool) -> ()) {
// …
}
或者,如果可能的话:
func isReachable(hostname: String, port: Int) -> Bool {
// …
}
我尝试在此swift implementation的帮助下延长Apple's Reachability
utility excellent answer来提出以下内容:
public class func reachabilityForHostname(hostname: String, port: Int) -> Reachability? {
var address = sockaddr_in()
address.sin_len = UInt8(sizeofValue(address))
address.sin_family = sa_family_t(AF_INET)
address.sin_addr = in_addr(string: hostname)
address.sin_port = UInt16(9000).bigEndian
let ref = withUnsafePointer(&address) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
return Reachability(reachabilityRef: ref)
}
问题是我在这里创建的可达性对象总是显示为可达(只要我的网络已连接) - 所以它实际上并不实际检查特定的主机名/端口正在运行(我正在尝试查看服务器是否在http://localhost:9000上运行。)
我已经读过Reachability
实际上可能不是这样 - 因为它只检查是否可以向指定的主机建立外部连接(不保证主机实际上在线)。
说了这么多,我的问题就是 - 如果我想检查特定主机(比如localhost)是否在特定端口上运行服务器,我有什么选择?