Reputation: 649
In my application want to check port is open or not. Here refer this link
But dnt get any solution. And also refer these two github source,
But dnt any solution. Any one help how check port is open or not. Thanks Advance.
Upvotes: 1
Views: 4686
Reputation: 117
I cannot add comments, so I am adding this as a separate answer. I followed Surani's answer, but encountered errors when using the port later in the application. I found I had to manually close the socket before returning the response.
So I modified the last 4 lines to
let isOpen = listen(socketFileDescriptor, SOMAXCONN ) != -1
Darwin.close(socketFileDescriptor)
return isOpen
Here is the revised version of Surani's answer with the socket closing code
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
}
Use like:
let port = UInt16(10000)
print(isPortOpen(port:port))
Upvotes: 3
Reputation: 13567
Please use the below method to port is open or not
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
}
Use like:
let port = UInt16(10000)
print(isPortOpen(port:port))
Upvotes: 5