2014-09-02 51 views
1

我正在開發一個使用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?

+0

TCP保持活動是爲了檢測空閒連接上的錯誤。這對「自動關閉」沒有幫助。後者是一個應用程序問題,爲了幫助您,您需要查看您的代碼。 – 2014-09-03 02:52:38

回答

2

CFDataRef是「免費電話橋接」到NSData,因此第一部分可以是 更簡單地寫爲

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

setsockopt()的「請將option_value」參數爲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>由defau進口LT。

+0

感謝您的回答。如果我得到'setsockopt失敗:0x00007ff369887200',你碰巧知道在哪裏看?也就是說,'setsockopt'函數返回-1。 – eightx2 2014-09-03 14:25:31

+0

@ eightx2:我已經更新了代碼,以便在故障情況下顯示正確的錯誤編號和消息。 - man頁面中列出了可能的errnos(終端中的「man setsockopt」或https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html) 。 – 2014-09-03 14:31:34

+0

@ eightx2:你有沒有進展? – 2014-09-06 07:46:34

相關問題