iOS 移动开发网络 part5.1:CocoaAsyncSocket^Overview

本文在笔者阅读CocoaAsyncSocket源码的基础上,还借鉴了涂耀辉解读CocoaAsyncSocket的系列文章.(ps:涂耀辉是笔者见过的解读源码最细心最有耐心的一位作者没有之一)

CocoaAsyncSocket在封装bsd socket的基础上还加入了TLS的内容,实现TLS又分为两种形式:Using CFStream for TLSUsing SecureTransport for TLS.(如果你对TLS一无所知可以先看看iOS 移动开发网络 part4:HTTPS的内容).

源码内很多判断都是为了区分以下三个数据来源:

data come from normal socket;
data come from CFStream for TLS;//仅iOS可用
data come from SecureTransport for TLS;

当然源码内复杂的还不止数据来源,还有:

1.纷繁

  • 纷繁的数据流向
socket move data to preBuffer;//socket内的数据读入预备缓存块
socket move data to currentRead->buffer;//socket内的数据读入当前包的缓存块
preBuffer move data to currentRead->buffer;//预备缓存块的数据读入当前包的缓存块
......                                     //还不止于以上三种
  • 纷繁的数据读取方式
全读
读定长
读边界

在这三个纷繁的基础上,三个纷繁的判断逻辑排列组合的出现在代码内,那酸爽.如源码内的- (void)doReadData方法带注释一共747行.

所以V:

如果不是诚心想学习IM相关知识,在这里就可以离场了... ------ 涂耀辉

2.可读数据与可写空间

CocoaAsyncSocket读取的时候,我们主要关注可读数据.
CocoaAsyncSocket写入的时候,我们主要关注可写空间.

以上两条是读写的宗旨,但笔者却在阅读源码时常常会忘记这两条宗旨,导致出现许多差错,这里提前写出来以做提醒.

3.线程安全

这部分虽然不是CocoaAsyncSocket的工作主线,但却服务于主线:

dispatch_retain//给MRC用的,现在可以不用看了
dispatch_source//监听socket
dispatch_queue_set_specific//防止队列重入造成的死锁

在看源码之前就能对以上三个内容有所了解,可以大大减小阅读源码的难度.

4.孰轻孰重

创建、连接、开启TLS、读取、写入,这五个过程中读取是最复杂的.在你读读取部分的代码或文章说明感到要崩溃的时候,请深-深--深---呼吸.

5.特殊说明

  • TCP vs UDP

CocoaAsyncSocket for TCP==>本文解析

GCDAsyncUdpSocket for UDP==>暂不解析

  • IPV4 IPV6 UN

CocoaAsyncSocket会有关于IPV4,IPV6,UN的区分.如:

int socket4FD;
int socket6FD;
int socketUN;

NSData * connectInterface4;
NSData * connectInterface6;
NSData * connectInterfaceUN;

dispatch_source_t accept4Source;
dispatch_source_t accept6Source;
dispatch_source_t acceptUNSource;
int socketFD = (socket4FD != SOCKET_NULL) ? socket4FD : (socket6FD != SOCKET_NULL) ? socket6FD : socketUN;

以上的这句代码你会看到N遍,选出3个中真正保有的那个进行读写.所以我们都只关注IPv4,其他的两种类型具体到代码级别没有很大的差别.

你可能感兴趣的:(iOS 移动开发网络 part5.1:CocoaAsyncSocket^Overview)