DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: Bizrusthelf
今日帖子: 7
在线用户: 32
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 dolang (dolang) ▲▲▲▲▲ -
普通会员
2018/8/21 14:53:07
标题:
android后台服务中使SSL报错called a function you should not call 浏览:264
加入我的收藏
楼主: 一个手机APP中使用了IDTCPClient+SSL来通信,在前台应用的FORM里运行一切都正常,长时间运行也正常,但是退出前台应用后,开启后台服务,在后台服务中再重新连接通信,发送几个心跳包之后,就报错:error:140C5042:SSL routines:SSL_UNDEFINED_FUNCTION:called a function you should not call。

服务器上的SSL版本是1.0.2j,在android里,使用tls1,tls1.1,tls1.2,测试过1.0.2g到1.0.2m的库,都会有这种情况。

请大家指导一下。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/8/21 14:58:45
1楼: 建议 源码发出来,大家帮你研究下。
当然,不乐意发也没关系。不强求。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 dolang (dolang) ▲▲▲▲▲ -
普通会员
2018/8/24 19:29:58
2楼: to wang_80919:

谢谢回复。我这两天把代码整理了一下,发现在安桌服务中,反复打开关闭服务时,调用IdHTTP1请求HTTPS就报错了。代码如下:

创建服务先初始一下:
procedure TDM.AndroidServiceCreate(Sender: TObject);
begin

  if JavaService <> nil then
  begin

    IdHTTP1.ConnectTimeout := 1000 * 15;
    IdHTTP1.ReadTimeout := 1000 * 10;
    IdHTTP1.Request.Connection := 'close';
    IdHTTP1.Request.CustomHeaders.AddValue('Connection', 'close');
    IdSSLIOHandler1.SSLOptions.CertFile := TPath.Combine(TPath.GetDocumentsPath, 'ca.cer');
    IdSSLIOHandler1.SSLOptions.KeyFile := TPath.Combine(TPath.GetDocumentsPath, 'ca.key_npw.pem');
    IdSSLIOHandler1.SSLOptions.Mode := sslmClient;
    IdSSLIOHandler1.SSLOptions.Method := sslvSSLv23;
    IdSSLIOHandler1.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
  end;
end;

启用服务时发请求:
function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  Result := TJService.JavaClass.START_NOT_STICKY;
  getServerIP(loginsymbol);
end;

procedure TDM.getServerIP(symbol: string);
var url: string;
    s: string;
begin

  url := 'https://xxxxx.com/xxxxxx';
  s := IdHTTP1.Get(url);
end;

执行这个方式之后,就报错了,跳到单元System.Generics.Collections,
function TThreadList<T>.LockList: TList<T>;
begin
  TMonitor.Enter(FLock);
  Result := FList;
end;
停在在这个方法里。

去掉SSL,直接用http发送请求就不报错了。

有人碰到这样的问题吗?
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2018/8/24 22:02:39
3楼: 看报错信息,还是openssl版本太低,有函数不认识
----------------------------------------------
只有偏执狂才能生存!
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/8/24 22:27:06
4楼: 我们又没办法调试你这几行代码。
要不你发完整的 CALLSTACK 也行。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 dolang (dolang) ▲▲▲▲▲ -
普通会员
2018/9/13 21:13:58
5楼: 经测试,应该是indy的问题,拉了SVN上的最新代码,还是一样的问题。

换了Synapse来做通讯,就一切正常了。

发一个地址,https://github.com/TetrisSQC/SynapseTCP

它可以在移动平台上使用,我测试过在XE10.2.3上android上是可以使用的,ios上还没有做测试,估计应该没问题的。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/9/13 22:32:48
6楼: 为啥你们这些奇奇怪怪的问题,我都遇不到呢。
不过算了,反正我的代码运行良好,我就不需要担心了。
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行46.875毫秒 RSS