###前提・実現したいこと
iOSの携帯端末で動作するSwift3のプロジェクトにおいて
UDP方式でテキストを送信する単純なプログラムを書いています
###発生している問題・エラーメッセージ
sockaddr_in から unsafePointer<sockaddr> の変換でかなり躓き
なんとかエラーなくsendto()に収めることができましたが
PC側でデータの受信ができません
###該当のソースコード
//sockaddr_inを作る関数
func getaddrinfo( address: String, port: CUnsignedShort) -> sockaddr_in{ let ipOcts = address.components(separatedBy: ".") let ipInt = ipOcts.enumerated().reduce(UInt32(0)){ (val, elm) in let u32 = UInt32(elm.element)! let shiftBits = 24 - UInt32(elm.offset) * 8 return val | (u32 << shiftBits) } return sockaddr_in( sin_len: UInt8(MemoryLayout<sockaddr_in>.stride), sin_family: UInt8(AF_INET), sin_port: port.bigEndian, sin_addr: in_addr(s_addr: ipInt), sin_zero: ( 0, 0, 0, 0, 0, 0, 0, 0 ) ) } func udpSend(textToSend: String, address: String, port: CUnsignedShort) { let fd = socket(AF_INET, SOCK_DGRAM, 0) // DGRAM makes it UDP var sendtext = textToSend var addr = getaddrinfo(address: address, port: port) withUnsafeMutablePointer(to: &sendtext) { textp in let cstr = UnsafeRawPointer(textp) withUnsafePointer(to: &addr){sockaddrInPtr in sockaddrInPtr.withMemoryRebound(to: sockaddr.self, capacity: 1){ sockaddrPtr in let check = sendto(fd, cstr, Int(strlen(sendtext)), 0, sockaddrPtr , socklen_t(MemoryLayout<sockaddr>.stride)) print(check) } } }
###試したこと
バージョンに適したunsafePointer系の取り扱い
###補足情報(言語/FW/ツール等のバージョンなど)
回答2件
あなたの回答
tips
プレビュー