Socket tips

封装消息

/*
             * 消息格式:
             * 
             *  0 1 2 3 4 ... Length
             * +-------+------------+
             * |Length | Payload    |
             * +-------+------------+
             *
 */
messageData = NSMutableData(capacity: Int(totalLength))
messageData?.appendBytes(&totalLength, length: sizeof(UInt32.self))
messageData?.appendData(payload)

最简单的消息,header+payload, header中只含有payload的长度,在往消息data上append数据时,对于一个UInt32,用appendBytes;payload可以用一个字典,序列化成data,直接appendData。

往Stream中写数据

func writeData(data: NSData, toStream stream: NSOutputStream, startingAtOffset offset: Int) -> Int {
    var written = 0
    var currentOffset = offset
    while stream.hasSpaceAvailable && currentOffset < data.length {
        let writeResult = stream.write(UnsafePointer(data.bytes) + currentOffset, maxLength: data.length - currentOffset)
        guard writeResult >= 0 else { return writeResult }
        written += writeResult
        currentOffset += writeResult
    }
    return written
}

把Socket地址转化成String

func saToString(sa: UnsafePointer) -> String? {
    var hostBuffer = [CChar](count: Int(NI_MAXHOST), repeatedValue:0)
    var portBuffer = [CChar](count: Int(NI_MAXSERV), repeatedValue:0)
    guard getnameinfo(sa, socklen_t(sa.memory.sa_len), &hostBuffer, socklen_t(hostBuffer.count), &portBuffer, socklen_t(portBuffer.count), NI_NUMERICHOST | NI_NUMERICSERV) == 0
        else { return nil }
    return String.fromCString(hostBuffer)
}

先把数据读到buffer中,再调用系统的函数getnameinfo().

微信公众号

开发者思维 devthinking

你可能感兴趣的:(Socket tips)