2014-07-24 2 views
5

신속하게 네트워크 코드를 작성하려고 노력하고 있습니다. 유형 검사가 적합합니다.신속하게 sockaddr_in을 sockaddr에 캐스팅하는 방법

var sock: CInt = ... 
var rin: sockaddr_in 
var rlen = socklen_t(sizeof(sockaddr_in)) 
var buffer: CChar[] = CChar[](count: 128, repeatedValue: 0) 

let len = recvfrom(sock, &buffer, 128, 0, &rin, &rlen) 

는 컴파일러는 &rinsockaddr_in 대신 sockaddr에 대한 포인터라는 사실에 대한 recvfrom에 (매우 비밀스럽게)를 뿌려줍니다. 포인터 유형을 변환하는 다양한 방법을 시도했지만이 권리를 얻을 수 없습니다.

내가 이것을 sockaddr이라고 선언하면 이것을 컴파일 할 수는 있지만 sockaddr_in으로 볼 수는 없습니다.

답변

5

업데이트 : 스위프트 1.2 (엑스 코드 6.3 베타)의 바와 같이, C 구조체 초기화하면 훨씬 간단한되었다 :

var rin = sockaddr_in() 

sockaddr_in 변수를 정의하고 0으로 모든 요소를 ​​초기화한다. sockaddr의 주소로 수행하는에 sockaddr_in의 주소의 변환은 다음과 같습니다

let len = withUnsafeMutablePointer(&rin) { 
    recvfrom(sock, &buffer, UInt(buffer.count), 0, UnsafeMutablePointer($0), &rlen) 
} 

올드 답 : 첫 번째 문제는 sockaddr_in 변수가 전에 초기화되어야한다는 것입니다 주소는 recvfrom()으로 전달 될 수 있습니다. 스위프트 복잡한 구조체를 초기화, 서투른 것 같다

https://stackoverflow.com/a/24335355/1187415에서 도우미 함수를 사용하여 : reinterpretCast()을 사용합니다 sockaddr 포인터에 sockaddr_in 포인터를 캐스팅하기 위해

var rin : sockaddr_in = initStruct() 

func initStruct<S>() -> S { 
    let struct_pointer = UnsafeMutablePointer<S>.alloc(1) 
    let struct_memory = struct_pointer.move() 
    struct_pointer.dealloc(1) 
    return struct_memory 
} 

소켓 주소를 초기화 할 수 있습니다.

let len = recvfrom(sock, &buffer, UInt(buffer.count), 0, reinterpretCast(&rin), &rlen) 
관련 문제