3 由socket读取数据 SymbianOS客户端API以异步请求的方式实现读取操作.此示例使用一个active object CSocketsReader来调度这些请求.
1.调用CSocketsReader::Start 函数,启动active object. void CSocketsReader::Start() { // 读取socket数据到iBuffer if (!IsActive()) { IssueRead(); } }
2-4.调用CSocketsReader::IssueRead通过RSocket::RecvOneOrMore函数向 socket server 发送一个读取请求.而后 SetActive() void CSocketsReader::IssueRead() { //读取socket数据到iBuffer __ASSERT_ALWAYS(!IsActive(), User::Panic(KPanicSocketsEngineRead, ESocketsBadState)); iSocket.RecvOneOrMore(iBuffer, 0, iStatus, iDummyLength); SetActive(); }
5.当至少有1byte数据读入缓冲时,RSocket::RecvOneOrMore请求完成,调用 CSocketsReader::RunL 函数 void CSocketsReader::RunL() { switch (iStatus.Int()) { case KErrNone: // 字符已由 socket 读取 iEngineNotifier.ResponseReceived(iBuffer); IssueRead(); // 启动下一读取任务 break; case KErrDisconnected: iEngineNotifier.ReportError(MEngineNotifier::EDisconnected, iStatus.Int()); break; default: iEngineNotifier.ReportError(MEngineNotifier::EGeneralReadError, iStatus.Int()); break; } }
6-7.使用CSocketsEngine::ResponseReceived函数通知Engine 数据已读取,启动下一读取请求. void CSocketsEngine::ResponseReceived(const TDesC8& aBuffer) { iConsole.PrintNotify(aBuffer); }
|