【问题标题】:Delphi Indy Ping Error 10040 after upgrade from XE3 to XE4从 XE3 升级到 XE4 后 Delphi Indy Ping 错误 10040
【发布时间】:2013-06-12 07:25:48
【问题描述】:

我创建了一个利用 Indy TIdIcmpClient 对象的 Ping 函数。它多年来一直完美无缺。从 XE3 升级到 XE4 后,相同的代码现在生成错误 10040(消息太长)。

我阅读了有关此错误和建议的解决方案的其他帖子,但没有一个是 100% 成功的。

我已将数据包大小减少到 32、24、12 甚至 0,但仍然收到 10040 错误。

我尝试使用可选参数“Buffer”,它有点作用,但偶尔会导致其他异常。

有人对如何解决这个问题有任何想法吗?

这是我的代码:

function Ping(Host: String;Timeout: Integer;ShowError: Boolean; out ErrorText: String): Boolean;
var
  IdIcmpClient1: TIdIcmpClient;
  Reply: TReplyStatusTypes;
  ErrorFlag: Boolean;
  ABuffer: String;
begin
  Result:=False;
  ErrorText:='Success';
  ErrorFlag:=False;
  Reply:=rsEcho;
  ABuffer:=Host+StringOfChar(' ',255);
  IdIcmpClient1:=TIdIcmpClient.Create;
  IdIcmpClient1.PacketSize:=32;
  IdIcmpClient1.Host:=Host;
  IdIcmpClient1.ReceiveTimeout:=Timeout;
  try
    try
      IdIcmpClient1.Ping(ABuffer);
    except
      on E: Exception do
      begin
        ErrorFlag:=True;
        ErrorText:=E.Message;
        if ShowError then MessageDlg('Ping Error: '+E.Message, mtWarning, [mbOK], 0);
      end;
    end;
    if not ErrorFlag then
    begin
      try
        Reply:=IdIcmpClient1.ReplyStatus.ReplyStatusType;
      except
        on E: Exception do
        begin
          ErrorFlag:=True;
          ErrorText:=E.Message;
          if ShowError then MessageDlg('Ping Reply Error: '+ErrorText, mtWarning, [mbOK], 0);
        end;
      end;
    end;
    if not ErrorFlag then
    begin
      Result:=Reply=rsEcho;
      if not Result then
      begin
        case Reply of
          rsEcho: ErrorText:='rsEcho';
          rsError: ErrorText:='rsError';
          rsTimeOut: ErrorText:='rsTimeOut';
          rsErrorUnreachable: ErrorText:='rsErrorUnreachable';
          rsErrorTTLExceeded: ErrorText:='rsErrorTTLExceeded';
          rsErrorPacketTooBig: ErrorText:='rsErrorPacketTooBig';
          rsErrorParameter: ErrorText:='rsErrorParameter';
          rsErrorDatagramConversion: ErrorText:='rsErrorDatagramConversion';
          rsErrorSecurityFailure: ErrorText:='rsErrorSecurityFailure';
          rsSourceQuench: ErrorText:='rsSourceQuench';
          rsRedirect: ErrorText:='rsRedirect';
          rsTimeStamp: ErrorText:='rsTimeStamp';
          rsInfoRequest: ErrorText:='rsInfoRequest';
          rsAddressMaskRequest: ErrorText:='rsAddressMaskRequest';
          rsTraceRoute: ErrorText:='rsTraceRoute';
          rsMobileHostReg: ErrorText:='rsMobileHostReg';
          rsMobileHostRedir: ErrorText:='rsMobileHostRedir';
          rsIPv6WhereAreYou: ErrorText:='rsIPv6WhereAreYou';
          rsIPv6IAmHere: ErrorText:='rsIPv6IAmHere';
          rsSKIP: ErrorText:='rsSkip';
        else
          ErrorText:='Unknown';
        end;
        if ShowError then MessageDlg('Ping Error: '+ErrorText, mtWarning, [mbOK], 0);
      end;
    end;
  finally
    IdIcmpClient1.Free;
  end;
end;

感谢您的宝贵时间,

有点

【问题讨论】:

    标签: delphi indy10


    【解决方案1】:

    TIdIcmpClient 的修复程序已经在进行中,但尚未发布,我目前没有该版本的预计到达时间。

    【讨论】:

    • @RemyLebeau,现在是 2014 年 2 月,我正在使用 C++ Builder XE5 和 Indy10 TIdIcmpClient Ping(),这个问题仍然存在。你们是在做这个还是已经发布了更新/修复?
    • 抱歉,我还没有 ANY 空闲时间来处理这个问题。在我的日常工作和我的家庭之间,我被淹没了,只是没有像以前那样的空闲时间。它仍然在我的 TODO 清单上。我对TIdIcmpClient 进行了一些更改,但尚未对其进行测试。
    【解决方案2】:

    你必须设置ABuffer,例如:

                Host := 'some.server.net';
                PacketSize := 24;
                ReceiveTimeout := 200;
                ABuffer := Host + StringOfChar(' ', 255);
                Ping(ABuffer);
    

    一月

    【讨论】:

    • 我可以确认这对 IDICMPClient 组件有效,至少在 Remy 和他的团队发布他们自己的修复程序之前。
    • 不幸的是,我已经在这样做了(它在上面的代码中)。这在大多数情况下都有效,但偶尔会导致异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多