我正在開發一個使用TCP連接到TCP服務器的iOS應用程序(使用Swift)。目前,只要我發送了一些東西,連接就會自動關閉。我想保持連接打開/活着,直到我手動關閉它。Swift: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));
}
我目前的快速實施/翻譯如下:
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)
的替代方案是一個不錯的主意。 - 代碼發生在使用
NSStreamDelegate
協議所需的功能func stream(theStream:NSStream, handleEvent streamEvent:NSStreamEvent)
中。 - 我不確定是否使用
inputStream
而不是theStream
(函數參數)是一個好主意。
我收到CFDataGetBytes
函數的Xcode錯誤。它說以下內容:
'NSData' is not a subtype of of 'CFData'
任何想法如何解決這個問題?
另外,如何在我的Swift文件中導入/包含<sys/socket.h>
?我已經看到了一些叫做橋接頭的東西,但是這不僅僅是和Swift實現並行的Obj-C?
TCP保持活動是爲了檢測空閒連接上的錯誤。這對「自動關閉」沒有幫助。後者是一個應用程序問題,爲了幫助您,您需要查看您的代碼。 – 2014-09-03 02:52:38