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>
。