2017-07-30 8 views
1

この関数は常にnilを返します。もし私がインターフェイス名を印刷すると名前 "en0"がないならば。私はデバイスのローカルIPアドレスを取得する必要があります、どうすればいいですか?関数getWiFiAddress()は常にnilを返しますか?

func getWiFiAddress() -> String? { 
var address : String? 

// Get list of all interfaces on the local machine: 
var ifaddr : UnsafeMutablePointer<ifaddrs>? 
guard getifaddrs(&ifaddr) == 0 else { return nil } 
guard let firstAddr = ifaddr else { return nil } 

// For each interface ... 
for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) { 
    let interface = ifptr.pointee 

    // Check for IPv4 or IPv6 interface: 
    let addrFamily = interface.ifa_addr.pointee.sa_family 
    if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) { 

     // Check interface name: 
     let name = String(cString: interface.ifa_name) 
     if name == "en0" { 

      // Convert interface address to a human readable string: 
      var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) 
      getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len), 
         &hostname, socklen_t(hostname.count), 
         nil, socklen_t(0), NI_NUMERICHOST) 
      address = String(cString: hostname) 
     } 
    } 
} 
freeifaddrs(ifaddr) 

return address 

}

答えて

0

あなたはのifaddrする任意の値を設定しませんでした。

0

の代わりにen1をen1に変更し、ローカルのIPアドレスを取得しました。理由はen0が有線またはイーサネットの場合、en1を使用する必要があるためです。我々は、我々が使用する必要があるローカルLANのIPを取得する必要がある場合

0

あなたは...

func getWiFiAddress() -> String? { 
    // Get list of all interfaces on the local machine: 
    var ifaddr : UnsafeMutablePointer<ifaddrs>? 
    guard getifaddrs(&ifaddr) == 0 else { return nil } 
    guard let firstAddr = ifaddr else { return nil } 

    // For each interface ... 
    for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) { 
     let interface = ifptr.pointee 

     // Check for IPv4 or IPv6 interface: 
     let addrFamily = interface.ifa_addr.pointee.sa_family 
     if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) { 

      // Check interface name: 
      let name = String(cString: interface.ifa_name) 
      if name == "lo0" { 

       // Convert interface address to a human readable string: 
       var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) 
       getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len), 
          &hostname, socklen_t(hostname.count), 
          nil, socklen_t(0), NI_NUMERICHOST) 
       freeifaddrs(ifaddr) 
       return String(cString: hostname) 
      } 
     } 
    } 
    return nil 
} 
+0

lo0では、ループバックインターフェイスのためにあるローカルアドレス

LO0

使用する必要があります有線ネットワークではen0、無線ではen1 ... –

関連する問題