注册

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的不同读取操作等等。
注:由于该框架源码篇幅过大,且有大部分相对抽象的数据操作逻辑,尽管楼主竭力想要简单的去陈述相关内容,但是阅读起来仍会有一定的难度。


附上一张核心代码逻辑图
75af0c9b371be2bda21fa4860e2fc450.png


文中涉及代码比较多,建议大家结合源码一起阅读比较容易能加深理解

之后会涉及到
CocoaAsyncSocket
初始化写包 :GCDAsyncWritePacket写入包放入我们的写入队列(数组)[writeQueue addObject:packet];离队执行 [self maybeDequeueWrite];


主要介绍GCDAsyncSpecialPacketGCDAsyncWritePacket类型数据的处理,还有核心写入方法doWriteData三种不同方式的写入



作者:Cooci
链接:https://www.jianshu.com/p/dfacaf629571





0 个评论

要回复文章请先登录注册