嘿,所有我得到“套接字错误#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
1条答案
按热度按时间wn9m85ua1#
我根据@RemyLebeau的评论发布了一个答案:
MacOS上的
SOCKET ERROR #1
表示不允许操作。您需要使用管理权限运行应用。
TIdIcmpClient
使用RAW套接字,大多数平台仅限管理员使用RAW套接字。所以你的代码是好的,你只需要运行你的应用程序与管理权限。
从@GorhinStroebel的评论中,如果你想通过终端在MacOS上使用Admin插件运行你的应用,你可以运行:
字符串