首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标C与Swift的苹果TLS的区别

目标C与Swift的苹果TLS的区别
EN

Stack Overflow用户
提问于 2016-05-16 22:09:03
回答 1查看 339关注 0票数 2

我正在使用苹果的CFNetworking获得一个TLS流。我在将Objective代码移植到Swift时遇到了一些困难。

使用完全相同的步骤,它在使用Objective时起作用,但在试图使用Swift时握手始终失败。

工作Obj-c

代码语言:javascript
复制
- (void)connect()
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
                                       (__bridge CFStringRef)hostAddress,
                                       port,
                                       &readStream,
                                       &writeStream);

    self.inputStream = (__bridge_transfer NSInputStream *)readStream;
    self.outputStream = (__bridge_transfer NSOutputStream *)writeStream;

    [self.inputStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL
                      forKey:NSStreamSocketSecurityLevelKey];
    [self.outputStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL
                       forKey:NSStreamSocketSecurityLevelKey];

    [self.inputStream setDelegate:self];
    [self.outputStream setDelegate:self];

    [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                forMode:NSDefaultRunLoopMode];

    [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                 forMode:NSDefaultRunLoopMode];

    [self.inputStream open];
    [self.outputStream open];
}

非工作斯威夫特

代码语言:javascript
复制
func connect() {
    var readStream: Unmanaged<CFReadStream>?
    var writeStream: Unmanaged<CFWriteStream>?

    let host = "some_host"
    let hostAsCFString = host as NSString
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
                                       hostAsCFString,
                                       1337,
                                       &readStream,
                                       &writeStream)

    inputStream = readStream!.takeRetainedValue()
    outputStream = writeStream!.takeRetainedValue()

    inputStream!.delegate = self
    outputStream!.delegate = self

    inputStream!.setProperty(NSStreamSocketSecurityLevelNegotiatedSSL,
                             forKey: NSStreamSocketSecurityLevelKey)
    outputStream!.setProperty(NSStreamSocketSecurityLevelNegotiatedSSL,
                              forKey: NSStreamSocketSecurityLevelKey)

    inputStream!.scheduleInRunLoop(.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    outputStream!.scheduleInRunLoop(.currentRunLoop(), forMode: NSDefaultRunLoopMode)

    inputStream!.open()
    outputStream!.open()
}

两者都试图连接到同一个服务器和同一个端口。

wireshark的屏幕抓取:

工作Obj-C

非工作斯威夫特

我对发生了什么事一无所知。我不知道为什么Obj版本用TLS v1.2启动客户机Hello,但是Swift尝试使用TLS v1.0,然后放弃。不知道为什么Swift版本要花这么长时间才能向客户发送Hello,一个Keepalive数据包是优先发送的?任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-17 13:36:33

结果没什么区别,我只是个白痴。一旦输入流和输出流都调用了outputStream.write()事件,我就立即调用NSStreamEvent.OpenCompleted。写到SSL握手的缓冲区里,然后把它搞砸了。

直到我为Obj和Swift创建了一个MVP,这才会发现,如果您花时间创建一个有效的MVP,您可能会在编写它时找到它。现在,如果我只能在握手完成后才能得到通知,那么这个问题将永远被避免。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37264055

复制
相关文章

相似问题

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