斯威夫特:TCP套接字保持活动(Swift: TCP socket keep-alive)

2019-10-20 20:52发布

我开发一个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>在我的雨燕文件? 我见过一些所谓的桥接头,但是,这不是只针对对象 - 并排侧斯威夫特实现?

Answer 1:

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

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

的“请将option_value”参数setsockopt()是一个的地址int (它被映射到快速作为UInt32 ),和最后一个参数必须是该变量的大小:

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>被默认导入。



文章来源: Swift: TCP socket keep-alive