Swift:TCP套接字保持活动

我正在开发一个iOS应用程序(使用Swift),它使用TCP连接到TCP服务器。 目前,只要我发送了一些东西,连接就会自动closures。 我想保持连接打开/活着,直到我手动closures它。

从这个基于Objective-C的问题中,我发现在Objective-C中可以这样做:

#include <sys/socket.h> ... CFDataRef socketData = CFReadStreamCopyProperty((__bridge CFReadStreamRef)(stream), kCFStreamPropertySocketNativeHandle); CFSocketNativeHandle socket; CFDataGetBytes(socketData, CFRangeMake(0, sizeof(CFSocketNativeHandle)), (UInt8 *)&socket); CFRelease(socketData); int on = 1; if (setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)) == -1) { NSLog(@"setsockopt failed: %s", strerror(errno)); } 

我目前的Swift实现/翻译如下所示:

 var socketData = CFReadStreamCopyProperty(inputStream, kCFStreamPropertySocketNativeHandle) as CFDataRef var socket: CFSocketNativeHandle CFDataGetBytes(socketData, CFRangeMake(0, sizeof(CFSocketNativeHandle)), (UInt8).self&socket) var on: UInt8 = 1; if setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &on, 255) == -1 { } 

一些注意事项:

  • inputStream被声明为: var inputStream: NSInputStream?
  • 我不确定是否使用255作为sizeof(on)的替代scheme是一个好主意。
  • 代码发生在使用NSStreamDelegate协议所需的函数func stream(theStream:NSStream, handleEvent streamEvent:NSStreamEvent)中。
  • 我不知道如果使用inputStream而不是theStream (函数参数)是一个好主意。

我得到了CFDataGetBytes函数的Xcode错误。 它说以下几点:

'NSData'不是'CFData'的子types

任何想法如何解决?

另外,如何在我的Swift文件中导入/包含<sys/socket.h> ? 我已经看到了一些叫做桥接头的东西,但是这不仅仅是和Swift实现并行的Obj-C吗?

CFDataRef是“免费桥接”到NSData ,因此第一部分可以更简单写成

 var socketData = CFReadStreamCopyProperty(inputStream, kCFStreamPropertySocketNativeHandle) as NSData var socket: CFSocketNativeHandle = 0 socketData.getBytes(&socket, length: sizeofValue(socket)) 

setsockopt()的“option_value”参数是一个int (它映射到Swift的UInt32 )的地址,最后一个参数必须是该variables的大小:

 var on: UInt32 = 1; if setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &on, socklen_t(sizeofValue(on))) == -1 { let errmsg = String.fromCString(strerror(errno)) println("setsockopt failed: \(errno) \(errmsg)") } 

默认情况下导入<sys/socket.h>