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

Posted

技术标签:

【中文标题】iOS Swift:如何检查端口是不是打开【英文标题】:iOS Swift: How to check if port is openiOS Swift:如何检查端口是否打开 【发布时间】:2019-05-16 11:17:47 【问题描述】:

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

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

但是没有得到任何解决方案。也可以参考这两个github源码,

https://github.com/swiftsocket/SwiftSocket

https://github.com/robbiehanson/CocoaAsyncSocket

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

【问题讨论】:

【参考方案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))

【讨论】:

addr.sin_addr = in_addr(s_addr: inet_addr("0.0.0.0")) 和 addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0) 这两个0行我想添加什么?帮帮我? 只需将“0.0.0.0”替换为您的套接字 URL,例如 127.0.0.1 用于 localhost 其余部分保持原样 addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0) 在这一行中我应该为 0 添加什么? 如何获取套接字 URL 帮助我? 你能回答我的问题吗?【参考方案2】:

我无法添加 cmets,因此我将其添加为单独的答案。我遵循了 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))

【讨论】:

谢谢,这有助于在检查后释放端口。

以上是关于iOS Swift:如何检查端口是不是打开的主要内容,如果未能解决你的问题,请参考以下文章

如何检查网络端口是不是打开?

如何检查客户端的网络/防火墙是不是打开端口?

如何检查客户端的网络/防火墙是不是打开端口?

检查服务器端口是不是从 Android 打开

如何检查端口是不是在带有批处理文件且没有第三方软件的远程服务器上打开? [关闭]

Swift如何检查API是不是不可用[重复]