2017-01-05 7 views
0

많은 시행 착오 끝에 아무런 도움없이이 질문에 도움이 필요할 것 같습니다.Swift의 sockaddr_in 구조체에서 IP 주소 및 포트 번호를 가져 오는 중입니까?

Swift 최신 버전의 sockaddr_in에서 어떻게 IP 주소와 포트 번호를 얻을 수 있습니까?

몇 가지 관련 질문을 보았지만 어디에서든지 적절한 예를 찾을 수없는 것 같습니다. 또한, C 타입 구조체와 포인터를 Swift에서 처리해야하는 방식을 실제로 파악하지 못하고 있는데, 실제로 도움이되지 않습니다.

누구든지 유용한 리소스에 대한 예 또는 링크를 제공 할 수 있습니까?

미리 감사드립니다.

답변

2

당신은 다음 직접 sockaddr_in의 해당 필드에 액세스 할 수 있습니다 수 있지만, 바이트 순서를 호스트로 네트워크 바이트 (빅 엔디안)의 값을 변환하는 기억으로 IP 주소와 포트해야하는 경우

let saddr: sockAddr = ... 

let port = in_port_t(bigEndian: sockAddr.sin_port) 
let addr = in_addr_t(bigEndian: sockAddr.sin_addr.s_addr) 

getnameinfo() 는 (점선 진수 표기) 캐릭터 로 IP 주소를 추출하여도 포트를 선택적으로 사용할 수있다. struct sockaddr 포인터 에 struct sockaddr_in 포인터를 캐스팅 는 withMemoryRebound()와 스위프트의 "리 바인딩"이라고하며 수행됩니다

이 IPv4 및 IPv6 모두 소켓 주소 구조 ( sockaddr_in 및) 작동
var sockAddr: sockaddr_in = ... 

var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) 
var service = [CChar](repeating: 0, count: Int(NI_MAXSERV)) 

withUnsafePointer(to: &sockAddr) { 
    $0.withMemoryRebound(to: sockaddr.self, capacity: 0) { 
     _ = getnameinfo($0, socklen_t($0.pointee.sa_len), 
         &hostname, socklen_t(hostname.count), 
         &service, socklen_t(service.count), 
         NI_NUMERICHOST | NI_NUMERICSERV) 
    } 
} 
print("addr:", hostname) 
print("port:", service) 

. "안전하지 않은 포인터 전환 '에 대한 자세한 내용은

SE-0107 UnsafeRawPointer APIUnsafeRawPointer Migration 참조하십시오. 후자의 페이지에는 Swift 3에서 소켓 주소를 처리하는 예제 코드가 포함되어 있습니다.