好的,原来答案其实很简单。您可以使用:
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
。哦,我是如何讨厌原始类型的不必要的别名,听起来像他们不是原始类型。