Delphi XE6和Android Ping

时间:2014-08-02 14:35:48

标签: android delphi ping indy delphi-xe6

我想ping Android平台中带有indy组件TidIcmpClient的服务器,但是调试器使用"套接字错误#1"来停止代码。代码在一个单独的线程中,所以我在这里发布线程代码:

procedure TEco.Execute;

var
   contadoreco: Cardinal;
   buffer: string;

begin
     buffer:='12345678901234567890123456789012';
     eco:=TIdIcmpClient.Create(nil);
     for contadoreco:=1 to 4 do
         begin
              with eco do
                   begin
                        ReceiveTimeout:=2000;
                        Host:=servidor;
                        PacketSize:=32;
                        Ping(buffer,contadoreco);
                        ipservidor:=ReplyStatus.FromIpAddress;
                   end;
              Synchronize(procedure
                          begin
                               Form1.StringGrid1.Cells[0,contadoreco]:=ipservidor;
                               Form1.StringGrid1.Cells[1,contadoreco]:=IntToStr(tiempoeco);
                          end);
         end;
     eco.Free;
end;

TEco对象在此处声明:

TEco = class(TThread)
           private
                  servidor: string;
                  eco: TIdIcmpClient;
                  terminado: Boolean;
                  tiempoeco: Cardinal;
                  ipservidor: string;
           protected
                    procedure Execute; override;
    end;

如何在Android中使用TidIcmpClient ping服务器?难道我做错了什么?超级用户权限还是一些?在此先感谢您的帮助,对不起英语不好。我希望你理解我的问题;):)

1 个答案:

答案 0 :(得分:2)

TIdIcmpClient使用RAW套接字,在大多数系统上都需要管理员/ root用户访问权限,包括Android。

使用Android自己的API在Android中执行ping有两种方法:

  1. 使用InetAddress类的isReachable()方法。但是,显然这是does not work correctly

  2. 使用java.lang.ProcessBuilder()生成/system/bin/ping。事实上,java.lang.Process文档显示了一个例子。缺点是您必须手动解析输出。

  3. 任何一种解决方案都要求您使用Delphi的JNI包装器来访问相关的Android API。