好的,原來答案其實很簡單。您可以使用:
void CFStreamCreatePairWithSocket (
CFAllocatorRef alloc,
CFSocketNativeHandle sock,
CFReadStreamRef *readStream,
CFWriteStreamRef *writeStream
);
...到CFReadStream
和CFWriteStream
綁定到已經連接插座。這個流程對我來說似乎有些落後(即,如果字節已經從套接字等中讀取了,爲什麼不能將某些東西綁定到監聽/服務器套接字,以便每次接受新連接時相應的CFReadStream
和CFWriteStream
實例會自動設置?),但無論如何。
的代碼是這樣:
int connectedSocketId = accept(socketId, (struct sockaddr *)&clientSocket, &addrlen);
if (connectedSocketId != -1) {
//successful connection
CFReadStreamRef clientInput = NULL;
CFWriteStreamRef clientOutput = NULL;
CFStreamCreatePairWithSocket(kCFAllocatorDefault, connectedSocketId, &clientInput, &clientOutput);
if (clientInput && clientOutput) {
CFReadStreamSetProperty(clientInput, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(clientOutput, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
if (! CFReadStreamOpen(clientInput) || ! CFWriteStreamOpen(clientOutput)) {
NSLog(@"Could not initialize streams!");
}
else {
//use the streams
}
}
}
因此,爲了實現重要的事情:
這是沒有必要綁定到任何你正在聽的插座;相反,可以將CFReadStream
和CFWriteStream
實例任意綁定到任何已連接的套接字,即使您已經從/向其讀取/寫入數據。
對於它所有的花哨的冗長,CFSocketNativeHandle
只是一個int
。哦,我是如何討厭原始類型的不必要的別名,聽起來像他們不是原始類型。