2017-10-04 16 views
2

私はTCPサーバーへの接続を確立しようとしましたが、残念なことに成功しません。ここに私の実際の方法です。誰が知っていますか、どこにエラーがありますか? CFSocketConnectToAddressにエラーが表示されています(エラー出力が表示されるため、印刷中にエラーが発生することがあります)。Swift(4)のCFSocket

アイデア?

host = "192.168.0.20" 
    port = 8888 
    socket = CFSocketCreate(kCFAllocatorDefault, 
          AF_INET, 
          SOCK_STREAM, 
          IPPROTO_TCP, 
          CFSocketCallBackType.readCallBack.rawValue, { (socket: CFSocket?, callBackType: CFSocketCallBackType, address: CFData?, data: UnsafeRawPointer?, info: UnsafeMutableRawPointer?) -> Void in print("callback test") }, nil) 
    if socket == nil { 
     print("Error while creating socket") 
    } else { 
     var sin = sockaddr_in(
      sin_len: UInt8(MemoryLayout<sockaddr_in>.size), 
      sin_family: sa_family_t(AF_INET), 
      sin_port: in_port_t(port), 
      sin_addr: in_addr(s_addr: inet_addr(host)), 
      sin_zero: (0,0,0,0,0,0,0,0) 
     ) 
     addressData = NSData(bytes: &sin, length: MemoryLayout.size(ofValue: sin)) as CFData 
     let connectResult: CFSocketError = CFSocketConnectToAddress(socket, addressData!, 10) 
     switch connectResult { 
     case .success: 
      print("Connected") 
     case .error: 
      print("Error while connecting") 
     case .timeout: 
      print("Timeout while connecting") 
     } 

答えて

0

問題はポートです! htonsマクロは迅速に利用できません。これは現在の作業方法です:

func connectToServer(timeout: Int=10) throws { 
    // check, if address is valid https://linux.die.net/man/3/inet_makeaddr 
    let inAddr = inet_addr(host) 
    if inAddr == INADDR_NONE { 
     throw SocketError.noValidAddress 
    } 

    let socket = CFSocketCreate(kCFAllocatorDefault, 
           AF_INET, 
           SOCK_STREAM, 
           IPPROTO_TCP, 
           CFSocketCallBackType.readCallBack.rawValue, 
           { (socket, callBackType, address, data, info) in 
            TCPClientCallBack(socket: socket, callBackType: callBackType, address: address, data: data, info: info) 
           }, 
           nil) 
    if socket == nil { 
     throw SocketError.socketCreationFailed 
    } 

    var sin = sockaddr_in() // https://linux.die.net/man/7/ip 
    sin.sin_len = __uint8_t(MemoryLayout.size(ofValue: sin)) 
    sin.sin_family = sa_family_t(AF_INET) 
    sin.sin_port = UInt16(port).bigEndian 
    sin.sin_addr.s_addr = inAddr 

    let addressDataCF = NSData(bytes: &sin, length: MemoryLayout.size(ofValue: sin)) as CFData 

    let socketErr = CFSocketConnectToAddress(socket, addressDataCF, CFTimeInterval(timeout)) 
    switch socketErr { 
    case .success: 
     print("connected") 
    case .error: 
     throw SocketError.connectionError 
    case .timeout: 
     throw SocketError.connectionTimeout 
    } 
} 

enum SocketError: Error { 
    case noValidAddress 
    case socketCreationFailed 
    case connectionError 
    case connectionTimeout 
}