分类:
2008-10-15 16:29:32
由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()
{
file://读取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);
}