我开发一个iOS应用程序(使用SWIFT),它使用一个TCP连接到TCP服务器。 目前,每当我送东西时,连接会自动关闭。 我想保持连接打开/活着,直到我手动关闭它。
从这个基于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));
}
我目前的快速实施/翻译如下:
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
(函数参数)是一个好主意。
我得到的一个Xcode错误CFDataGetBytes
功能。 它说以下内容:
“的NSData”不是的“CFData”的子类型
不知道如何解决这个问题?
此外,如何导入/包括<sys/socket.h>
在我的雨燕文件? 我见过一些所谓的桥接头,但是,这不是只针对对象 - 并排侧斯威夫特实现?