iOS Swift: 如何检查端口是否打开
iOS Swift: How to check if port is open
在我的应用程序中想要检查端口是否打开。这里参考这个link
iOS SDK: How can I check if a port is open?
但是没有得到任何解决方案。并参考这两个 github 来源,
但是没有任何解决方案。任何人都可以帮助检查端口是否打开。提前致谢。
请使用以下方法判断端口是否打开
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))
我无法添加评论,所以我将其添加为单独的答案。我遵循了 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))
在我的应用程序中想要检查端口是否打开。这里参考这个link
iOS SDK: How can I check if a port is open?
但是没有得到任何解决方案。并参考这两个 github 来源,
但是没有任何解决方案。任何人都可以帮助检查端口是否打开。提前致谢。
请使用以下方法判断端口是否打开
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))
我无法添加评论,所以我将其添加为单独的答案。我遵循了 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))