2014-07-24 19 views
5

dökümü Bazı ağ kodlarını hızlı bir şekilde yapmaya çalışıyorum ve tür denetimi bana uyuyor.Nasıl sockaddr_in sockaddr için hızlı bir şekilde

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) 

derleyici &rinsockaddr_in yerine sockaddr bir işaretçi olduğu gerçeğini recvfrom de (çok şifreli olarak) şikayet. İşaretçi türünü dönüştürmek için çeşitli yollar denedim, ancak bunu doğru göremiyorum.

Bunu bir sockaddr olarak bildirirseniz bunu derlemek için alabilirim, ancak daha sonra sockaddr_in olarak bakamıyorum.

cevap

5

güncelle: Swift 1.2 (Xcode 6.3 beta) itibariyle, bir Cı-yapı başlatılıyor çok daha basit hale gelmiştir:

var rin = sockaddr_in() 

bir sockaddr_in değişken tanımlar ve sıfıra tüm elemanları başlatır. sockaddr bir adres olarak yapılır bir karşı sockaddr_in bir adresin dönüşüm aşağıdaki gibidir:

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

Eski cevap: ilk sorun sockaddr_in değişken önce sisteme yüklenmek olmasıdır adresinin adresi recvfrom()'a iletilebilir. Swift karmaşık yapılar başlatılıyor, beceriksiz gibi görünüyor

https://stackoverflow.com/a/24335355/1187415 gelen yardımcı fonksiyonunu kullanarak: reinterpretCast() kullanın sockaddr işaretçi sockaddr_in işaretçi döküm için

var rin : sockaddr_in = initStruct() 

olarak

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

soket adresi başlatılabilir.

let len = recvfrom(sock, &buffer, UInt(buffer.count), 0, reinterpretCast(&rin), &rlen) 
İlgili konular