如何在iOS应用程序上保持套接字打开

时间:2015-12-19 18:53:37

标签: ios swift sockets

我有一个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非常相似 但我不确定这将与我的代码一起使用(或者我将如何在我的代码中实现它)。我更像是一个高级初学者而不是高级开发人员,因此我们非常感谢答案。谢谢!

0 个答案:

没有答案