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)