【问题标题】:Delphi XE6 and Android PingDelphi XE6 和 Android Ping
【发布时间】:2014-09-25 14:17:30
【问题描述】:

我想在 Android 平台中使用 indy 组件 TidIcmpClient 对服务器执行 ping 操作,但调试器会以“Socket Error #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 服务器?难道我做错了什么?超级用户权限之类的?在此先感谢您对我的帮助,并为英语不好感到抱歉。我希望你能理解我的问题;) :)

【问题讨论】:

    标签: android delphi ping indy delphi-xe6


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢 Remy :) 我会尝试这两种解决方案,我会在这里评论结果。非常感谢 Remy :) 非常感谢你的帮助 :)
    • 我还想做一个问题。如果我使用 posix 函数(例如 spawn)并且我读取了 de STDOUT 流......我想我会做和 java.lang.processbuilder() 一样的事情,或者不是?我做这个问题,因为 delphi xe6 有 posix 库,使用它们可能非常有趣(比 jni 更容易)。再次提前谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 2023-03-09
    • 2014-07-08
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    相关资源
    最近更新 更多