我正在使用苹果的CFNetworking获得一个TLS流。我在将Objective代码移植到Swift时遇到了一些困难。
使用完全相同的步骤,它在使用Objective时起作用,但在试图使用Swift时握手始终失败。
工作Obj-c
- (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];
}非工作斯威夫特
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数据包是优先发送的?任何帮助都将不胜感激。
发布于 2016-05-17 13:36:33
结果没什么区别,我只是个白痴。一旦输入流和输出流都调用了outputStream.write()事件,我就立即调用NSStreamEvent.OpenCompleted。写到SSL握手的缓冲区里,然后把它搞砸了。
直到我为Obj和Swift创建了一个MVP,这才会发现,如果您花时间创建一个有效的MVP,您可能会在编写它时找到它。现在,如果我只能在握手完成后才能得到通知,那么这个问题将永远被避免。
https://stackoverflow.com/questions/37264055
复制相似问题