a. 清空_readFdsCopy、_writeFdsCopy,
b. 把_readFds、_writeFds赋值给_readFdsCopy、_writeFdsCopy
c. 再调用select(MAP_KEY(--_fdState.end()) + 1, &_readFdsCopy, &_writeFdsCopy, NULL, &_timeout)进行socket轮询
d. 遍历FOR_MAP(_activeIOHandlers, uint32_t, IOHandler *, i),检查IOHandler所对应的socket是否在其中, FD_ISSET(MAP_VAL(i)->GetInboundFd(), &_readFdsCopy) 或者 FD_ISSET(MAP_VAL(i)->GetOutboundFd(), &_writeFdsCopy)
e. 如果存在fdSets中,就调用相应IOHandler的OnEvent
e.1. accept(_inboundFd, &address, &len)
e.2. setFdOptions(fd, false)
e.3. BaseProtocol *pProtocol = ProtocolFactoryManager::CreateProtocolChain(_protocolChain, _parameters)
e.4. 根据accept返回的fd创建TCPCarrier()实例对象,构造函数里面就把设置为可读数据状态、注册到IOHandlerManager中
e.5. pTCPCarrier->SetProtocol(pProtocol->GetFarEndpoint());设置pTCPCarrier的协议为远点协议TCPProtocol
e.6. pProtocol->GetFarEndpoint()->SetIOHandler(pTCPCarrier); 设置远点协议的IOHandler为TCPCarrier
e.7. pProtocol->GetNearEndpoint()->SetApplication(_pApplication); 设置近点协议的应用为本身应用对象(AdminApplication)
e.8. pProtocol->GetNearEndpoint()->GetOutputBuffer()不为NULL,则pProtocol->GetNearEndpoint()->EnqueueForOutbound();
举例:GetNearEndpoint返回InboundRTMPProtocol对象,GetOutputBuffer()实际是调用BaseRTMPProtocol对象中的IOBuffer _outputBuffer;EnqueueForOutbound()实际调用_pFarProtocol->EnqueueForOutbound(),_pFarProtocol为TCPProtocol(),调用TCPProtocol::EnqueueForOutbound(),即是_pCarrier->SignalOutputData(),此函数只是ENABLE_WRITE_DATA
f. 如果在OnEvent()中处理失败就调用EnqueueForDelete()进入状态清理工作,主要是清理_fdState中关于此socket的状态(相应的去设置_readFds、_writeFds的状态),并把IOHandler加入到_deadIOHandlers MAP中
然后在TCPCarrier中做数据的收发动作!根据读写进行相应的操作:
读:
TCPCarrier的_pProtocol为TCPProtocol a. IOBuffer *pInputBuffer = _pProtocol->GetInputBuffer(); //近点协议带有关于输入的IOBuffer _inputBuffer
以上实际调用TCPProtocol::GetInputBuffer()接口,然后返回TCPProtocol对象的成员 _inputBuffer b. if (!pInputBuffer->ReadFromTCPFd(_inboundFd, _recvBufferSize, _ioAmount)) c. _pProtocol->SignalInputData(_ioAmount)
在函数内会调用_pNearProtocol->SignalInputData(_inputBuffer),对应调用BaseRTMPProtocol::SignalInputData()接口,在此函数内部进行输入数据的解析。
写:
a. pOutputBuffer = _pProtocol->GetOutputBuffer()
在函数内部调用_pNearProtocol->GetOutputBuffer(),实际调用BaseRTMPProtocol::GetOutputBuffer(),返回
BaseRTMPProtocol的成员IOBuffer _outputBuffer b. pOutputBuffer->WriteToTCPFd(_outboundFd, _sendBufferSize, _ioAmount)