我想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服务器?难道我做错了什么?超级用户权限还是一些?在此先感谢您的帮助,对不起英语不好。我希望你理解我的问题;):)
答案 0 :(得分:2)
TIdIcmpClient
使用RAW套接字,在大多数系统上都需要管理员/ root用户访问权限,包括Android。
使用Android自己的API在Android中执行ping有两种方法:
使用InetAddress
类的isReachable()
方法。但是,显然这是does not work correctly。
使用java.lang.ProcessBuilder()
生成/system/bin/ping
。事实上,java.lang.Process
文档显示了一个例子。缺点是您必须手动解析输出。
任何一种解决方案都要求您使用Delphi的JNI包装器来访问相关的Android API。