Symbian中的gprs连接关断方法

在Symbian开发中,很多朋友都提出了gprs连接无法关断的问题。

这种问题的主要表象是——当我们关闭gprs连接的时候,程序就发生异常退出了。(屡试不爽)

这是为什么呢?

我做了很多试验 ,都一样的效果,即使采用Nokia论坛提供的例子也是同样的结果。

只要把socket engine一删除,整个程序就退出了。

就拿HttpExample为例,我们看看它的析构函数是如何操作的吧:

CClientEngine::~CClientEngine() {
iSession.Close();
iSocketServ.Close() ;
delete iPostData;
iPostData = NULL;
}

我试过这个析构函数,如果直接delete掉CClientEngine引擎对象,那么程序会毫不犹豫的

退出,而不是关掉连接。如果把iSocketServ.Close()这句注释掉,就像下面这样:

CClientEngine::~CClientEngine() {
iSession.Close();
// iSocketServ.Close() ; <------ 注释掉
delete iPostData;
iPostData = NULL;
}

那么程序的gprs连接根本不会断开。

这可如何是好呢?我们知道symbian系统也是运行在arm处理器上的,而iSession是包含有flash芯片上的文件操作的。那么会不会是由于芯片处理速度太慢或者由于关断iSession需要一段时间(其实也就是1~2秒钟的时间),而这个操作恰恰是异步的行为导致的呢?

我们假设一下,如果iSession.Close()的操作是异步的,在Symbian系统还没有把iSession关闭之前,我们调用了iSockServ.Close(),这样就导致了错误。

出于这个疑问,我开始了试验,我先手工添加如下函数:

void CClientEngine::CloseSockSvr()
{
iSocketServ.Close() ;
if(iCurConn == EConnected) iCurConn = ENotConnected ;
}

void CClientEngine::CloseSession()
{
iSession.Close() ;
}

也就是不从析构函数中直接关闭iSession和iSocketServ,而是把这两个关闭函数独立出来,变成公有函数,由CClientEngine引擎的外部来逐一关闭。

试验证明,这样从菜单上,先手工关闭iSession,然后等一至两秒钟后,再手工关闭iSocketServ,是完全可以实现gprs连接关闭的,而且程序也不会退出。

时间: 2024-12-02 14:38:14

Symbian中的gprs连接关断方法的相关文章

我们在Windows 8系统中无线网络连接的设置方法

第一步.首先单击托盘中的网络图标,在弹出的右侧网络边栏中查看飞行模式是否开启,如果开启则需要关闭它.然后在Wi-Fi中找到私有的无线网络SSID(无线网络广播名称),单击"连接". 第二步.然后,在白色方框中输入该私有无线网络的安全密钥,如果感觉输入错误,可以单击右侧的眼睛图标查看输入的内容,确认无误后单击"下一步". 第三步.如果网络安全密钥输入正确,此时计算机已经能够通过无线网络连接到因特网了,即可开始使用.当然,无线网络连接还有最后一步,是否启用电脑之间的共享

Symbian中把字符串变成数字的方法

我们知道C语言中又很方便的函数,很多种方法可以把字符串变成数字, 比如 char * p = "100" ; int a; a = atoi(p) ; // 此时a的值就是100了. 或者用这种办法也可以,就是慢点: sscanf(p, "%d", &a) ; 这样也可以达到同样的效果. 但是symbian开发环境中遇到这种情况,我们该怎么做呢? 我们可以考虑采用TLex类,来实现同样的功能. TBufC buffer = _L("124"

IIS中保持HTTP连接的设置方法_win服务器

大多数 Web 浏览器要求服务器在多个请求中保持连接打开.这被称为保持 HTTP 连接.保持连接是一个 HTTP 规范,它能够显著增强服务器性能.如果没有它,浏览器将必须为包含多个元素(如图形)的页进行大量的连接请求.可能需要为每个元素进行单独连接.这些额外的请求和连接要求额外的服务器活动和资源,这将会降低服务器的效率.它们还会大大降低浏览器的速度和响应能力,尤其是在网络连接速度较慢的地方. 在安装进程中,将默认启用保持 HTTP 连接.启用后,保持连接的持续时间是连接超时设置允许的时间. 集成

sql server 2012中实现字符串连接的新方法

--sqlserver 2012之前的版本 /* 处理not null字符 */ DECLARE @t1 varchar(10) = 'a' DECLARE @t2 varchar(10) = 'b' DECLARE @t3 varchar(10) = 'c' DECLARE @t4 varchar(10) = 'd' DECLARE @N1 int = 2012 SELECT @t1+@t2+@t3+@t4+convert(varchar(10),@N1 ) as result go /* 处

Android中判断网络连接状态的方法_Android

App判断用户是否联网是很普遍的需求,实现思路大概有下面几种 利用Android自带的ConnectivityManager类 有时候连上了wifi,但这个wifi是上不了网的,我们可以通过ping www.baidu.com来判断是否可以上网 也可以利用get请求访问www.baidu.com,如果get请求成功,说明可以上网 1.判断网络是否已经连接 // check all network connect, WIFI or mobile public static boolean isNe

windows系统中安装Redis+连接PHP的方法

1 下载Redis的windows32位客户端:http://pan.baidu.com/s/1ntK6AyH 下载后建议解压到web目录之类的地方,譬如:C:AppServredis 2 在命令行窗口中输入:redis-server.exe redis.conf 如果看到以下界面则表示redis服务器启动成功 3 下载php的reids扩展,便于在php中操作redis 下载地址:http://pan.baidu.com/s/1c0u04Go(适合php5.2版本) 下载完成后解压将php_r

SQL Server中使用Linkserver连接Oracle的方法_MsSql

1.安装Oracle Client 连接到Oracle的前提是在SQL Server服务器上安装Oracle Client.Oracle Client下载地址如下: http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html 安装完毕后要修改对应的tnsnames文件才能连接对应的数据,该文件所在目录: Oracle安装路径\product\10.2.0\client_1\NETWOR

SQL Server中使用Linkserver连接Oracle的方法

1.安装Oracle Client 连接到Oracle的前提是在SQL Server服务器上安装Oracle Client.Oracle Client下载地址如下: http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html 安装完毕后要修改对应的tnsnames文件才能连接对应的数据,该文件所在目录: Oracle安装路径\product\10.2.0\client_1\NETWOR

Android中判断网络连接状态的方法

App判断用户是否联网是很普遍的需求,实现思路大概有下面几种 利用Android自带的ConnectivityManager类 有时候连上了wifi,但这个wifi是上不了网的,我们可以通过ping www.baidu.com来判断是否可以上网 也可以利用get请求访问www.baidu.com,如果get请求成功,说明可以上网 1.判断网络是否已经连接 // check all network connect, WIFI or mobile public static boolean isNe