【问题标题】:iOS - Getting CFReadStream/CFWriteStream from a socketiOS - 从套接字获取 CFReadStream/CFWriteStream
【发布时间】:2012-04-11 18:16:54
【问题描述】:

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

但是,我找不到同样简单的方法来设置套接字以侦听/接受传入连接。所以我回到基础并使用socket()bind()listen()accept() 来实现低级连接处理,很大程度上是按照这里的示例进行的:

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

这很好,但是现在我能够接受传入的连接,我想知道如何创建 CFReadStreamCFWriteStream 实例来管理它们。有没有直接的方法?

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

【问题讨论】:

    标签: ios sockets networking


    【解决方案1】:

    好的,原来答案其实很简单。你可以使用:

    void CFStreamCreatePairWithSocket (
        CFAllocatorRef alloc,
        CFSocketNativeHandle sock,
        CFReadStreamRef *readStream,
        CFWriteStreamRef *writeStream
    );
    

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

    代码如下:

    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。哦,我多么讨厌将原始类型不必要的别名化为听起来不是原始类型的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 2013-04-27
      • 2012-02-04
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      相关资源
      最近更新 更多