Network programming Swift 2检查端口是否忙

Network programming Swift 2检查端口是否忙,network-programming,port,swift2,Network Programming,Port,Swift2,有人能告诉我如何在Swift2中发现端口忙吗 因为我写的mac应用程序有一个自己编写的Tcp服务器,但有时它不会启动,因为它“无法绑定到端口”。那么,我如何检查端口是否未被使用,以再次阻止Tcp服务器的开始按钮,直到端口空闲为止 我不想要一个新的框架 谢谢主要代码取自Swifter: 更新Swift 4的正确答案: func checkTcpPortForListen(port: in_port_t) -> (Bool, descr: String) { let socketFi

有人能告诉我如何在Swift2中发现端口忙吗

因为我写的mac应用程序有一个自己编写的Tcp服务器,但有时它不会启动,因为它“无法绑定到端口”。那么,我如何检查端口是否未被使用,以再次阻止Tcp服务器的开始按钮,直到端口空闲为止

我不想要一个新的框架


谢谢

主要代码取自Swifter:


更新Swift 4的正确答案:

func checkTcpPortForListen(port: in_port_t) -> (Bool, descr: String) {

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

    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 {
        let details = descriptionOfLastError()
        release(socket: socketFileDescriptor)
        return (false, "\(port), BindFailed, \(details)")
    }
    if listen(socketFileDescriptor, SOMAXCONN ) == -1 {
        let details = descriptionOfLastError()
        release(socket: socketFileDescriptor)
        return (false, "\(port), ListenFailed, \(details)")
    }
    release(socket: socketFileDescriptor)
    return (true, "\(port) is free for use")
}

func release(socket: Int32) {
    Darwin.shutdown(socket, SHUT_RDWR)
    close(socket)
}

func descriptionOfLastError() -> String {
    return String.init(cString: (UnsafePointer(strerror(errno))))
}
func checkTcpPortForListen(端口:in\u port\t)->(Bool,descr:String){
让socketFileDescriptor=socket(AF_INET,SOCK_STREAM,0)
如果socketFileDescriptor==-1{
返回值(false,“SocketCreationFailed,\(DescriptionFlasterRor())”)
}
var addr=sockaddr_in()
设sizeOfSockkAddr=MemoryLayout.size
地址:sin_len=_uint8_t(sizeOfSockkAddr)
地址:sinu family=sa_family(AF_INET)
addr.sin_port=Int(OSHostByteOrder())==OSLittleEndian?_OSSwapInt16(port):端口
addr.sin\u addr=in\u addr(s\u addr:inet\u addr(“0.0.0.0”))
addr.sin_zero=(0,0,0,0,0,0,0)
var bind_addr=sockaddr()
memcpy(&bind_addr,&addr,Int(sizeOfSockkAddr))
如果Darwin.bind(socketFileDescriptor,&bind_addr,socklen_t(sizeOfSockkAddr))=-1{
let details=DescriptionFlasterRor()
释放(套接字:socketFileDescriptor)
返回(false,“\(端口),BindFailed,\(详细信息)”)
}
如果侦听(socketFileDescriptor,SOMAXCONN)=-1{
let details=DescriptionFlasterRor()
释放(套接字:socketFileDescriptor)
返回(false,“\(端口),ListenFailed,\(详细信息)”)
}
释放(套接字:socketFileDescriptor)
返回值(true,“\(端口)可免费使用”)
}
func释放(套接字:Int32){
Darwin.关机(插座,关机)
关闭(插座)
}
func DescriptionFlasterRor()->字符串{
返回String.init(cString:(UnsafePointer(strerror(errno)))
}
编辑: 调用此函数的示例:

var portNum: UInt16 = 0
        for i in 50000..<65000 {
            let (isFree, _) = checkTcpPortForListen(port: UInt16(i))
            if isFree == true {
                portNum = UInt16(i)
                break;
            }
        }
var-portNum:UInt16=0

对于50000中的i..无法编译这一行:
如果bind(socketFileDescriptor,&bind_addr,socklen_t(sizeof(sockaddr_in))==-1{
有编译错误,什么错误?XCode的什么版本?在7.2版(7C68)上是OKHi。此方法需要传递端口号,当我不知道此端口时,我想列出可用的端口。你能提供一些方法吗?非常抱歉,我没有仔细阅读此主题,这是针对macOS的,但我正在寻找仅适用于IOS的解决方案:(.您使用过它吗?将代码添加到xCode项目中,然后出现错误:。我不知道它是否适用于IOS…我尝试从0->65000运行I,仅获得portNum=0。您能帮我知道为什么无法获得portNumber吗?摄像头rtsp链接为rtsp://admin:admin@192.168.100.177:5544/cam/realmonitor?通道=1,子类型=0,单播=true,协议=Onvifedit泰德:不间断地从0->65000运行,我收到所有信息“端口”免费使用”
var portNum: UInt16 = 0
        for i in 50000..<65000 {
            let (isFree, _) = checkTcpPortForListen(port: UInt16(i))
            if isFree == true {
                portNum = UInt16(i)
                break;
            }
        }