首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS -从套接字获取CFReadStream/CFWriteStream

iOS -从套接字获取CFReadStream/CFWriteStream
EN

Stack Overflow用户
提问于 2012-03-28 15:09:13
回答 1查看 4.2K关注 0票数 2

我正在尝试向iOS库添加一些简单的点对点连接功能。对传出连接进行编码非常简单;对CFStreamCreatePairWithSocketToHost的调用连接到远程主机,并设置从远程主机读取/向其写入的流。很简单。

但是,我找不到一种同样简单的方法来设置套接字来侦听/接受传入的连接。因此,我回到了基础,并使用socket()bind()listen()accept()来实现低级连接处理,很大程度上模仿了下面的示例:

http://www.pcs.cnu.edu/~dgame/sockets/server.c

这一切都很好,但是现在我可以接受传入的连接了,我想知道如何创建CFReadStreamCFWriteStream实例来管理它们。有没有简单的方法可以做到这一点?

顺便说一句,我知道存在一个支持异步服务器套接字的CocoaAsyncSocket库,但我对异步解决方案真的不感兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-29 09:34:04

好吧,事实证明答案其实相当简单。您可以使用:

代码语言:javascript
复制
void CFStreamCreatePairWithSocket (
    CFAllocatorRef alloc,
    CFSocketNativeHandle sock,
    CFReadStreamRef *readStream,
    CFWriteStreamRef *writeStream
);

...to将CFReadStreamCFWriteStream绑定到已连接的套接字。这个流程对我来说似乎有点倒退(例如,如果已经从套接字读取了字节,等等,为什么不能只将某些内容绑定到侦听/服务器套接字,以便每次接受新连接时都会自动设置相应的CFReadStreamCFWriteStream实例?),但不管怎样。

代码是这样的:

代码语言:javascript
复制
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
        }
    }
}

因此,需要认识到的重要事情是:

  1. 没有必要将任何东西绑定到您正在侦听的套接字;相反,可以将CFReadStreamCFWriteStream实例任意绑定到任何已连接的套接字,即使您已经从该套接字读取数据或向其写入数据。
  2. 尽管CFSocketNativeHandle非常冗长,但它只是一个int。哦,我多么讨厌原始类型的不必要的别名,因为听起来它们不是原始类型。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9902707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档