首 页 | 新 闻 | Symbian | Android| Windows Mobile | J2ME | 下载中心 | 游戏策划招聘与求职 | 购书指南 | 视频教程
您现在的位置: 开发视界 >> Symbian >> 网络 >> 正文
Socket 引擎的设计与实现8
作者:Peter Ji…    文章来源:Symbian 中文技术周刊    更新时间:2005-12-28 16:41:13

4 向 socket 写入数据
Symbian  OS  socket 客户端API以异步请求的方式实现写入操作.此示例使用一个
active object CSocketsReader来调度这些请求.
CSocketWriter 使用一个缓冲(iTransferBuffer)来实时接受来UI的缓冲
(iWriteBuffer),为了避免冲突发送是异步进行的.当写入完成时检测有无其它待写入的缓冲并发送.写入请求如不能在规定时间内完成则取消
1.当用户通过 UI 输入字符,且引擎已连接时,将键入字符转换为byte使用
CSocketsEngine::WriteL 函数发送至引擎
void CSocketsEngine::WriteL(const TDesC8& aData)
    {
// Write data to socket
if (iEngineStatus == EConnected)
        {
        iSocketsWriter->IssueWriteL(aData);
        }
    }

2.请求通过 CSocketWriter::IssueWriteL传递给CSocketWriter class
void CSocketsWriter::IssueWriteL(const TDesC8& aData)
    {
if ((iWriteStatus != EWaiting) && (iWriteStatus != ESending))
        {
        User::Leave(KErrNotReady);
        }
if ((aData.Length() + iTransferBuffer.Length()) >
iTransferBuffer.MaxLength())
        {
// 缓冲空间不足
        User::Leave(KErrOverflow);
        }
// 加入缓冲数据
iTransferBuffer.Append(aData);

if (!IsActive())
        {
        SendNextPacket();
        }
    }

3.数据复制到transfer缓冲,调用CSocketWriter::SendNextPacket
void CSocketsWriter::SendNextPacket()
    {
if (iTransferBuffer.Length() > 0)
        {
// Move data from transfer buffer to actual write buffer
        iWriteBuffer = iTransferBuffer;
        iTransferBuffer.Zero();
    iSocket.Write(iWriteBuffer, iStatus);  // Initiate actual write
// Request timeout
    iTimer->After(iTimeOut);
    SetActive();
    iWriteStatus = ESending;
        }
else
        {
    iWriteStatus = EWaiting;
        }
    }

4.CSocketsWriter::SendNextPacket移动数据到write buffer,清除transfer buffer并调用 RSocket::Write 函数发送数据请求

5-6.CSocketsWriter   对象状态改为ESending,然后启动计时器控制
RSocket::Write 的状态.调用 SetActive.

7.RSocket::Write 请求完成,调用 CSocketsWriter::RunL 函数
void CSocketsWriter::RunL()
    {
    iTimer->Cancel();

// Active object request complete handler
if (iStatus == KErrNone)
    {
switch(iWriteStatus)
    {
// Character has been written to socket
case ESending:
                SendNextPacket();
break;
default:
                User::Panic(KPanicSocketsEngineWrite, ESocketsBadStatus);
break;
    };
    }
else
    {
// Error: pass it up to user interface
        iEngineNotifier.ReportError(MEngineNotifier::EGeneralWriteError,
iStatus.Int());
        iWriteStatus = EWaiting;
    }
    }

8-9.取消计时器(异步操作完成),调用CSocketsWriter:;SendNextPacket发送所有积累的数据.CSocketsWriter状态改回EWaiting

相关文章:
如何在进程间共享文件句柄
能力(Capabilities)
在S60 3rd的手机上显示所有已安装程序的Uid
S60平台:Bluetooth API开发伙伴指南——蓝牙开发接口V2的结构
创建不提示用户使用哪种方法连接或者选择哪个GPRS接入点的Internet连接
如何在SYMBIAN60中编写DLL
在Symbian exe 程序中显示图形
利用Recognizer编写自己的开机自启动程序
 

站点地图 | 加入收藏 | 联系站长 | 广告服务 |
QQ:280529124  Tel:0592-8271361 辽ICP备05021703号