Chrome源代码分析之socket(六)

TCPClientSocketWin中有一个细节这里单独提一下,由于其WriteRead函数返回的值得有2种,I/O字节数或者错误代码,由于WINERRWSAERR中定义的错误是整数,而ReadWrite的返回值包含了错误代码和正常的I/O字节数,因此需要将系统错误代码转化为私有的为负的错误代码。这些是通过调用MapWinsockError函数来实现的。另外还需要定义私有的错误代码来替代系统错误代码。

这里我们可以完整的总结一下TCPClientSocketWin处理上层的URL请求的过程。

最先被调用的自然是Connect(CompletionCallback* callback)函数,它只有一个参数,即调用者指定的回调函数,非关键部分都略却,函数首先做的是设置next_connect_state_CONNECT_STATE_CONNECT,然后调用DoConnectLoop,很明显,此函数通过循环的方式来处理整个TCP连接过程,由于初始状态是CONNECT_STATE_CONNECT,代码会跳转到DoConnect,如果DoConnect立即完成,他会设置状态为CONNECT_STATE_CONNECT_COMPLETE,这样,下一个循环代码则跳转到DoConnectComplete,处理一些必要的过程。如果DoConnect返回的是ERR_IO_PENDING,说明连接请求进入异步等待状态,此时结束循环并将这个状态返回给Connect,在Connect里面,如果发现连接请求进入ERR_IO_PENDING状态,就把传递进来的回调函数赋予read_callback_,随后整个函数返回到调用者,通过层层的返回,最初的调用者会收到这个异步等待状态。

 


回顾整个TCPClientSocketWin类,当调用者要建立一个连接的时候,它首先调用Connect函数,并在DoConnect中创建socket和调用系统API:connect,当连接成功建立直接,DidCompleteConnect会被执行,这个函数会通过回调函数通知上层调用者。

当上层调用者需要发送或者接收来自网络的I/O数据,则调用Write或者Read,他们分别有自己的实现函数。

通过这样一个模式,上层调用者与通信模块实现了分离,通信模块与线程之间实现了分离。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值