我有一个iOS应用程序,我在其中与作为TCP服务器的wifi芯片通信。问题是插槽(关闭?)在3分钟,45秒后空闲。我已经听说过keepalive信号,而且从我的研究来看,似乎我应该能够使用像setsockopt这样的东西来保持连接打开。我无法让它正常工作。
以下是我尝试使用的代码:
var outputStream: NSOutputStream!
var readStream: Unmanaged<CFReadStreamRef>?
var writeStream: Unmanaged<CFWriteStreamRef>?
CFStreamCreatePairWithSocketToHost(nil,serverAddress, serverPort, &readStream, &writeStream)
inputStream = readStream!.takeRetainedValue() // ???
outputStream = writeStream!.takeRetainedValue()
inputStream.open()
outputStream.open()
outputCommandQueue = OutgoingCommandQueue(Stream: outputStream)
var optval: Int = 1; // Use 1 to enable the option, 0 to disable
let socketData = CFWriteStreamCopyProperty(outputStream, kCFStreamPropertySocketNativeHandle) as! Int32 // Get a reference to the socket itself.
setsockopt(socketData, SOL_SOCKET, SO_KEEPALIVE, &optval, socklen_t(sizeof(Int))) // setsockopt(ref of socket, at socket level, option to keepalive, set equal to one (on), something about the length of the variable)
我添加了最后三行代码以保持我的连接活着,并且编译得很好,但是在解开一个Optional值时,我得到了一个&#34;意外发现的nil&#34;
上的错误let socketData = ...
线。
显然我的CFWriteStreamCopyProperty行没有返回一个值(或返回一个nil值),但这让我不知道我做错了什么。非常感谢任何关于我做错的帮助/指示,或者我是否只是在这里使用了错误的方法。
问题与Swift: TCP socket keep-alive非常相似 但我不确定这将与我的代码一起使用(或者我将如何在我的代码中实现它)。我更像是一个高级初学者而不是高级开发人员,因此我们非常感谢答案。谢谢!