《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之88——BREW应用向其他平台的移植

简介: 版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。 https://blog.csdn.net/wireless_com/article/details/5981443

以把一个BREW上功能移植到Symbian平台为例,看一下具体的实现方式。由于网络应用的重要地位,这里先使用BREW3.xISockPort建立一个TCP的连接。首先,初始化服务器的地址:

pME->m_saSockAddr.wFamily = AEE_AF_INET;

pME->m_saSockAddr.inet.port = HTONS(SERVER_PORT);

INET_PTON(pMe->saSockAddr.wFamily, SERVER_ADDR, &(pMe->saSockAddr.inet.addr));

然后创建并打开ISockPort

ret = ISHELL_CreateInstance(pME->m_pIShell, AEECLSID_SOCKPORT, (void**)&(pME->m_pISockPort));

ret = ISOCKPORT_OpenEx(pME->m_pISockPort, AEE_AF_INET, AEE_SOCKPORT_STREAM, 0);

接下来建立TCP连接,

ret = ISOCKPORT_Connect(pME->m_pISockPort, &pME->m_saSockAddr);

if (AEEPORT_WAIT == ret){

ISOCKPORT_WriteableEx(pME->m_pISockPort,&pME->m_cbWriteCallback, MyApp_TryConnect, pME);

return;

}

建立连接成功后,就可以从服务器读写数据了

ret=ISOCKPORT_Write(pME->m_pISockPort,pME->m_caWriteBuffer + pME->m_nBytesWritten, BUFFER_SIZE - pME->m_nBytesWritten);

// retry later

if (AEEPORT_WAIT == ret){

ISOCKPORT_WriteableEx(pME->m_pISockPort, &pME->m_cbWriteCallback, CApp_TryWrite, pME);

return;

}

最后,取消回调并释放ISockPort接口。

CALLBACK_Cancel(&pME->m_cbReadCallback);

CALLBACK_Cancel(&pME->m_cbWriteCallback);

IBASE_Release((IBase*)(pME->m_pISockPort));

 

Symbian 是使用C++的,移植以上功能的时候,需要使用Symbian OS 中客户端服务器框架。首先从 CActive 创建自己的对象:

#include <e32base.h>

#include <in_sock.h>

#include <es_sock.h>

class CTCPConnector : public CActive

{

private:

// these are some of the classes relevant to opening a TCP connection:

TInt iState;

RSocket iSocket;

RSocketServ iSocketServer;

RHostResolver iResolver;

TInetAddr iAddress;

}

然后定义服务方法

void CTCPConnector::MakeOutgoingConnectionL(const TDesC& aHost, TInt aPort){

...

iState = EGetByName;

iResolver.GetByName( /* parameters required for resolving a host */);

...

}

接下来实现建立连接的方法

void CSEIConnector::ConnectSocketL(void){

...

iSocketServer.Connect();

...

iSocket.Open(iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);

...

iSocket.Connect(/*parameters required connecting */);

...

iSocket.Connect(iAddress, iStatus);

iState = ESocketConnect;

...

}

最后实现RunL() 来处理事件通知:

void CTCPConnector::RunL(){

TInt error = KErrNone;

switch(iState)

{

case EGetByName:

{

ConnectSocketL();

break;

}

case ESocketConnect:

{

ProcessRequestL();

break;

}

}

}

Symbian中的工作流程是这样的,客户端调用MakeOutgoingConnectionL() MakeOutgoingConnectionL()首先发起 DNS 查询,如果域名被成功解析,则开始调用CTCPConnector::RunL()。在CTCPConnector::RunL()中,先要检查请求的状态,如果当前状态值是EGetByName就可以调用ConnectSocketL()了。在ConnectSocketL()中,要创建客户端和服务器的类以及相应的RSocket RSocketServer。最后,调用RSocket::Connect() 来创建正在的TCP连接,无论连接成功或者失败,都将再一次运行RunL(),具体的数据读写过程以此类推。

目录
相关文章
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
LEC: 基于Transformer中间层隐藏状态的高效特征提取与内容安全分类方法
通过利用Transformer中间层的隐藏状态,研究提出了层增强分类(LEC)技术,该技术能够以极少的训练样本和参数实现高效的内容安全和提示注入攻击分类,显著提升了模型的性能,并验证了其跨架构和领域的泛化能力。
347 11
LEC: 基于Transformer中间层隐藏状态的高效特征提取与内容安全分类方法
|
运维 Kubernetes Cloud Native
莉莉丝游戏云原生之路
本文将介绍莉莉丝游戏云原生化的背景、挑战,以及应对的解决方案,记录了莉莉丝游戏云原生化历程,为游戏架构云原生转型提供经验。
莉莉丝游戏云原生之路
|
运维 负载均衡 算法
|
存储 文字识别 算法
解析!文档扫描 SDK 中的高级图像处理技术
本博客讨论了图像质量在文档扫描中的重要性,解决了扫描过程中遇到的常见挑战,以及文档扫描 SDK 利用先进的图像处理技术来应对这些挑战。
|
设计模式 算法 Java
Java中的设计模式:实战案例分享
Java中的设计模式:实战案例分享
|
Java 测试技术 数据库
SpringBoot——学会使用Test,检测自己写的代码
各位小伙伴们,上次已经讲解了用SpringBoot实现技术整合,体验SpringBoot的简化开发,今天这一篇介绍代码的测试。测试是保障程序正确性的唯一屏障,在企业级开发中更是不可缺少,但是由于测试代码往往不产生实际效益,所以在发开中,有时会跳过测试,我们往往这一块比较短板,所以还是要拿出来把这一块知识好好说说,做一名专业的开发人员。
574 0
重装Win7时提示“缺少所需的CD/DVD驱动器设备驱动程序”
好多朋友都是这样,自己的电脑用的时间长了而又懒得经常去清理修复,或者因为偶尔中毒,系统运行不畅甚至崩溃。这几天每天都在网上找资料、下载资料,弄得自己的本本凌乱不堪,也懒得花时间去整理修复了,今天,终于彻底罢工不干了。
重装Win7时提示“缺少所需的CD/DVD驱动器设备驱动程序”
|
搜索推荐 数据可视化 BI
【氚云】佰荣名品家居借力氚云,升级企业管理之道
佰荣名品家居借力氚云,升级企业管理之道
274 0
【氚云】佰荣名品家居借力氚云,升级企业管理之道
|
弹性计算 安全 开发者
ECS服务器使用体验与收获
通过“高校学生在家实践”这次云实践活动,我能充分感受到阿里云对学生党的热情,提供了这么不错的活动让学生党也能体验云服务器操作的快乐感,让自己体验在云服务器里配置环境,搭建网站的快乐。也希望阿里云越做越好~推出更多的可以让学生党或者开发者更加优惠或者更多免费体验的活动!
|
人工智能 AI芯片
寒武纪推出第二代云端AI芯片,采用16nm工艺性能比上代提升4倍
寒武纪宣布推出第二代云端AI芯片思元270(MLU270)及板卡产品,目标是提供速度更快、功耗更低、性价比更高的AI加速解决方案。
1982 0