iOS Swift:如何检查端口是否打开

时间:2019-05-16 11:17:48

标签: ios swift sockets port asyncsocket

在我的应用程序中要检查端口是否打开。这里参考此链接

  

iOS SDK: How can I check if a port is open?

但是dnt没有任何解决方法。并参考这两个github源码

  

https://github.com/swiftsocket/SwiftSocket

     

https://github.com/robbiehanson/CocoaAsyncSocket

但是没有任何解决方法。任何人都可以帮助您检查端口是否打开。谢谢前进。

2 个答案:

答案 0 :(得分:1)

请使用以下方法将端口打开或关闭

func isPortOpen(port: in_port_t) -> Bool {

    let socketFileDescriptor = socket(AF_INET, SOCK_STREAM, 0)
    if socketFileDescriptor == -1 {
        return false
    }

    var addr = sockaddr_in()
    let sizeOfSockkAddr = MemoryLayout<sockaddr_in>.size
    addr.sin_len = __uint8_t(sizeOfSockkAddr)
    addr.sin_family = sa_family_t(AF_INET)
    addr.sin_port = Int(OSHostByteOrder()) == OSLittleEndian ? _OSSwapInt16(port) : port
    addr.sin_addr = in_addr(s_addr: inet_addr("0.0.0.0"))
    addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0)
    var bind_addr = sockaddr()
    memcpy(&bind_addr, &addr, Int(sizeOfSockkAddr))

    if Darwin.bind(socketFileDescriptor, &bind_addr, socklen_t(sizeOfSockkAddr)) == -1 {
        return false
    }
    if listen(socketFileDescriptor, SOMAXCONN ) == -1 {
        return false
    }
    return true
}

用法如下:

let port = UInt16(10000)
print(isPortOpen(port:port))

答案 1 :(得分:0)

我无法添加评论,因此我将其添加为单独的答案。我遵循了Surani的回答,但是稍后在应用程序中使用端口时遇到错误。我发现我必须手动关闭套接字才能返回响应。

所以我将最后4行修改为

    let isOpen = listen(socketFileDescriptor, SOMAXCONN ) != -1
    Darwin.close(socketFileDescriptor)
    return isOpen

这是Surani答案的修订版,其中包含套接字关闭代码

func isPortOpen(port: in_port_t) -> Bool {

    let socketFileDescriptor = socket(AF_INET, SOCK_STREAM, 0)
    if socketFileDescriptor == -1 {
        return false
    }

    var addr = sockaddr_in()
    let sizeOfSockkAddr = MemoryLayout<sockaddr_in>.size
    addr.sin_len = __uint8_t(sizeOfSockkAddr)
    addr.sin_family = sa_family_t(AF_INET)
    addr.sin_port = Int(OSHostByteOrder()) == OSLittleEndian ? _OSSwapInt16(port) : port
    addr.sin_addr = in_addr(s_addr: inet_addr("0.0.0.0"))
    addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0)
    var bind_addr = sockaddr()
    memcpy(&bind_addr, &addr, Int(sizeOfSockkAddr))

    if Darwin.bind(socketFileDescriptor, &bind_addr, socklen_t(sizeOfSockkAddr)) == -1 {
        return false
    }
    let isOpen = listen(socketFileDescriptor, SOMAXCONN ) != -1
    Darwin.close(socketFileDescriptor)
    return isOpen
}

使用方式:

let port = UInt16(10000)
print(isPortOpen(port:port))