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

如何在iOS应用程序上保持套接字打开,ios,swift,sockets,Ios,Swift,Sockets,我有一个iOS应用程序,在其中我与充当TCP服务器的wifi芯片通信。问题是,在空闲3分钟45秒后,插座(关闭?)会关闭。我听说过keepalive信号,从我的研究中,似乎我应该能够使用setsockopt之类的工具来保持连接的开放性。我就是不能让它正常工作 以下是我尝试使用的代码: var outputStream: NSOutputStream! var readStream: Unmanaged<CFReadStreamRef>? var writeS

我有一个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)
线路

很明显,我的CFWriteStreamCopyProperty行没有返回值(或返回nil值),但这让我无法确定我做错了什么。非常感谢任何关于我做错了什么,或者我只是使用了错误的方法的帮助/指点

这个问题和
但我不确定这是否适用于我的代码(或者我将如何在代码中实现它)。我更像是一个高级初学者,而不是一个高级开发人员,所以请用简单的术语回答。谢谢

我没有做太多的套接字编程,所以我在这里可能有点离谱。文档说,
kCFStreamPropertySocketNativeHandle
的值是一个
CFData
对象(标题返回
AnyObject!
),所以我不认为
是!Int32将永远不会成功。在调试过程中,您可能希望取消强制转换(或将其移动到单独的
if let
语句)。此外,从代码段来看,这似乎不可能,但请仔细检查
outputStream
是否为
nil
(这也是一个隐式展开的可选语句,因此可能会导致相同的错误消息)我没有做太多的套接字编程,所以我在这里可能有点离谱。文档说,
kCFStreamPropertySocketNativeHandle
的值是一个
CFData
对象(标题返回
AnyObject!
),所以我不认为
是!Int32将永远不会成功。在调试过程中,您可能希望取消强制转换(或将其移动到单独的
if let
语句)。此外,从代码段来看,这似乎不可能,但请仔细检查
outputStream
是否为
nil
(这也是一个隐式展开的可选语句,因此可能会导致相同的错误消息)
let socketData = ...