【发布时间】:2014-09-02 20:58:04
【问题描述】:
我正在开发一个 iOS 应用程序(使用 Swift),它使用 TCP 连接到 TCP 服务器。目前,只要我发送了一些东西,连接就会自动关闭。我想保持连接打开/活动,直到我手动关闭它。
从this Objective-C-based question我发现在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)是否是个好主意。 - 代码发生在函数
func stream(theStream:NSStream, handleEvent streamEvent:NSStreamEvent)中,这是使用NSStreamDelegate协议所必需的。 - 我不确定使用
inputStream代替theStream(函数参数)是否是个好主意。
我在 CFDataGetBytes 函数上遇到 Xcode 错误。上面写着:
'NSData' 不是 'CFData' 的子类型
知道如何解决这个问题吗?
另外,如何在我的 Swift 文件中导入/包含 <sys/socket.h>?我见过一种叫做桥接头的东西,但这不只适用于 Obj-C 与 Swift 实现的并行吗?
【问题讨论】:
-
TCP keep-alive 是为了检测空闲连接上的错误。它对“自动关闭”没有帮助。后者是一个应用程序问题,需要查看您的代码才能提供帮助。