CocoaAsyncSocket源码Read(七)
最后还是提下SSL
的回调方法,数据解密的地方。两种模式的回调;
Part7.两种SSL
数据解密位置:
1.CFStream
:当我们调用:
CFIndex result = CFReadStreamRead(readStream, buffer, defaultBytesToRead);
数据就会被解密。
2.SSL
安全通道:当我们调用:
OSStatus result = SSLRead(sslContext, buffer, (size_t)estimatedBytesAvailable, &bytesRead);
会触发SSL
绑定的函数回调:
//读函数
static OSStatus SSLReadFunction(SSLConnectionRef connection, void *data, size_t *dataLength)
{
//拿到socket
GCDAsyncSocket *asyncSocket = (__bridge GCDAsyncSocket *)connection;
//断言当前为socketQueue
NSCAssert(dispatch_get_specific(asyncSocket->IsOnSocketQueueOrTargetQueueKey), @"What the deuce?");
//读取数据,并且返回状态码
return [asyncSocket sslReadWithBuffer:data length:dataLength];
}
接着我们在下面的方法进行了数据读取:
//SSL读取数据最终方法
- (OSStatus)sslReadWithBuffer:(void *)buffer length:(size_t *)bufferLength
{
//...
ssize_t result = read(socketFD, buf, bytesToRead);
//....
}
其实
read
这一步,数据是没有被解密的,然后传递回SSLReadFunction
,在传递到SSLRead
内部,数据被解密。本篇重点涉及该框架是如何利用缓冲区对数据进行读取、以及各种情况下的数据包处理,其中还包括普通的、和基于
注:由于该框架源码篇幅过大,且有大部分相对抽象的数据操作逻辑,尽管楼主竭力想要简单的去陈述相关内容,但是阅读起来仍会有一定的难度。
TLS
的不同读取操作等等。注:由于该框架源码篇幅过大,且有大部分相对抽象的数据操作逻辑,尽管楼主竭力想要简单的去陈述相关内容,但是阅读起来仍会有一定的难度。
附上一张核心代码逻辑图
文中涉及代码比较多,建议大家结合源码一起阅读比较容易能加深理解
CocoaAsyncSocket
初始化写包 :
GCDAsyncWritePacket
写入包放入我们的写入队列(数组)[writeQueue addObject:packet];
离队执行 [self maybeDequeueWrite];
GCDAsyncSpecialPacket
和GCDAsyncWritePacket
类型数据的处理,还有核心写入方法doWriteData
三种不同方式的写入链接:https://www.jianshu.com/p/dfacaf629571