delphi Indy SOCKET ERROR #1 on MacOS,using IdIcmpClient,works fine on Windows

pod7payv  于 12个月前  发布在  Mac
关注(0)|答案(1)|浏览(163)

嘿,所有我得到“套接字错误#1”在macOS上使用indy,此代码在Windows上工作正常.使用FMX在这里.使用macOS索诺马防火墙在macOS主机上关闭.

procedure TFrame_PingIPDomain.PingIPDomain;
begin
  memOutput.Lines.Clear;

  IdIcmpClient.ReceiveTimeout := Round(sbTimeout.Value);
 // IdIcmpClient.PacketSize := Round(sbPacketSize.Value);
  IdIcmpClient.Host := edtIPDomain.Text;

  memOutput.Lines.Add('Pings:');
  memOutput.Lines.Add('======================================');

  var AvgTime: Double := 0.0;
  var PingTimes := TList<Double>.Create;

  for var I := 1 to Round(sbPingCount.Value) do
  begin
    IdIcmpClient.Ping();
    if IdIcmpClient.ReplyStatus.ReplyStatusType = rsEcho then
    begin
      var RoundTripTime := IdIcmpClient.ReplyStatus.MsRoundTripTime;
      PingTimes.Add(RoundTripTime);
      memOutput.Lines.Add('Reply from ' + IdIcmpClient.ReplyStatus.FromIpAddress + ': time=' + RoundTripTime.ToString + 'ms');
    end
    else if IdIcmpClient.ReplyStatus.ReplyStatusType = rsTimeout then
      memOutput.Lines.Add('Ping request timed out')
    else
      memOutput.Lines.Add('Ping request failed');
  end;

  PingTimes.Sort;
  for var I := 1 to PingTimes.Count-1 do
    AvgTime := AvgTime + PingTimes.Items[I];
  AvgTime := AvgTime / PingTimes.Count;

  memOutput.Lines.Add('======================================');
  memOutput.Lines.Add('Statistics:');
  memOutput.Lines.Add('======================================');
  memOutput.Lines.Add('Min Time: ' + PingTimes.First.ToString + 'ms');
  memOutput.Lines.Add('Max Time: ' + PingTimes.Last.ToString + 'ms');
  memOutput.Lines.Add('Avg Time: ' + AvgTime.ToString + 'ms');

end;

字符串
插槽错误#1

wn9m85ua

wn9m85ua1#

我根据@RemyLebeau的评论发布了一个答案:
MacOS上的SOCKET ERROR #1表示不允许操作
您需要使用管理权限运行应用。TIdIcmpClient使用RAW套接字,大多数平台仅限管理员使用RAW套接字。
所以你的代码是好的,你只需要运行你的应用程序与管理权限。
从@GorhinStroebel的评论中,如果你想通过终端在MacOS上使用Admin插件运行你的应用,你可以运行:

sudo path-to.app/Contents/MacOS/Your_App_Name

字符串

相关问题