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<UInt8>(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<sockaddr>) -> 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容