【问题标题】:Setting TCP_NODELAY for NSOutputStream in Swift在 Swift 中为 NSOutputStream 设置 TCP_NODELAY
【发布时间】:2016-01-06 00:08:27
【问题描述】:

This answerthis answer 都显示了如何在Objective-C 中为NSOutputStream 设置TCP_NODELAY。我需要一些帮助才能让它在 Swift 中工作,我相信这可能只是我在使用 API 时犯的一个错误。

这是应该有效的Objective-C 解决方案:

CFDataRef nativeSocket = CFWriteStreamCopyProperty(`myWriteStream`, kCFStreamPropertySocketNativeHandle);
CFSocketNativeHandle *sock = (CFSocketNativeHandle *)CFDataGetBytePtr(nativeSocket);
setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, &(int){ 1 }, sizeof(int));
CFRelease(nativeSocket);

这是我尝试将其翻译成Swift

let nativeSocket: CFDataRef = CFWriteStreamCopyProperty(myWriteStream, kCFStreamPropertySocketNativeHandle).data
let sock = CFSocketNativeHandle(CFDataGetBytePtr(nativeSocket).memory)
var one = Int(1)
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &one, UInt32(sizeofValue(one)))

真正的问题是从myWriteStreamNSOutputStream)获取CFDataRef,然后从中获取CFSocketNativeHandle。在上面的Swift 代码中,它总是在尝试创建nativeSocket(特别是尝试访问data 属性)时在第一行崩溃。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: objective-c swift cocoa networking nsstream


    【解决方案1】:

    好吧,过了一会儿我想通了。这是其他人需要的工作代码:

    let socketData = CFWriteStreamCopyProperty(self.outputStream!, kCFStreamPropertySocketNativeHandle) as! CFData
    let handle = CFSocketNativeHandle(CFDataGetBytePtr(socketData).memory)
    var one: Int = 1
    let size = UInt32(sizeofValue(one))
    setsockopt(handle, IPPROTO_TCP, TCP_NODELAY, &one, size)
    

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 2021-03-26
      • 2012-12-27
      • 2023-03-15
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多