在 Swift 中为 NSOutputStream 设置 TCP_NODELAY
Posted
技术标签:
【中文标题】在 Swift 中为 NSOutputStream 设置 TCP_NODELAY【英文标题】:Setting TCP_NODELAY for NSOutputStream in Swift 【发布时间】:2016-01-06 00:08:27 【问题描述】:This answer 和this 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)))
真正的问题是从myWriteStream
(NSOutputStream
)获取CFDataRef
,然后从中获取CFSocketNativeHandle
。在上面的Swift
代码中,它总是在尝试创建nativeSocket
(特别是尝试访问data
属性)时在第一行崩溃。
有人可以帮我解决这个问题吗?
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于在 Swift 中为 NSOutputStream 设置 TCP_NODELAY的主要内容,如果未能解决你的问题,请参考以下文章
无法调配 NSOutputStream 的 write:MaxLength:
通过 NSInputStream 和 NSOutputStream 进行视频流