如何检查远程主机是否在纯Swift中的特定端口上运行服务器?

时间:2015-08-29 01:41:06

标签: swift sockets swift2 reachability

我想编写一个函数来检查主机名是否可以在特定的端口上访问。所以,像:

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)是否在特定端口上运行服务器,我有什么选择?

0 个答案:

没有答案