【问题标题】:getting asynchronous socket error 10049 even if i use try..except即使我使用 try..except 也会出现异步套接字错误 10049
【发布时间】:2010-08-01 16:09:16
【问题描述】:

当我运行我的程序(在调试器/ide 之外)时,我得到错误异步套接字错误 10049,我不应该收到消息对话:''错误''?请参阅下面的代码

begin
    try
       ClientSocket1.open;
    except
       showmessage('error');
    end;
end;

我做错了什么?

【问题讨论】:

    标签: delphi sockets exception-handling try-finally tclientsock


    【解决方案1】:

    你应该做的是处理 TClientSocket 的 Error 事件,因为你可以在那里捕获你的套接字错误。

    ErrorCode 参数是具有 WinSock 错误代码的参数 如果你想静默Error,你可以设置ErrorCode为0,这样可以防止异常被抛出,然后你就可以识别错误是什么并按照你想要的方式处理它

    procedure TForm1.ClientSocket1Error(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    var error : Integer; 
    begin
    
       error := ErrorCode; {prevent exception from being thrown}
    
       ErrorCode := 0;
    
       if error = 10049 then
         showmessage('asynchronous socket error');
    .
    .
    .
    
    
    end;
    

    希望对你有帮助

    盖坦西里

    【讨论】:

      【解决方案2】:

      TClientsocket组件(已经是deprecatedfor a while)使用异步通信模型,所以有可能异常不是在Open方法中抛出,而是在接收传入数据的消息/事件处理方法中抛出.

      更新:如果我输入了无效的 IP 地址(如 1.2.3.4),我可以使用 Delphi 6 和给定的代码重现此问题

      为了解决这个问题,我会转移到像 Indy 或 Ararat Synapse 这样的 TCP/IP 库(两者都有通用的 TCP 客户端组件)。

      【讨论】:

      • 代码在连接到服务器(在其他程序中)时工作正常,但是当服务器不存在时,我得到 10049 错误而不是我想要的(带有消息“错误”的消息框)
      • 为什么建议搬到不同的图书馆?下面列出了用户问题的解决方案。我有多年来一直使用 TServerSocket 和 TClientSocket 的商业项目,它们仍然可以正常工作。我知道它们不适用于 Unicode,但除此之外,我看不出它们有什么问题,而且它们很容易使用..
      • 简单规则:如果某些东西被声明为“弃用”,请尽早开始寻找替代品。 (它可能在下一个版本中不可用或完全损坏。)
      • @mjustin:你是对的,当 TClientSocket 在非阻塞模式下工作时,异常不会发生在 Open() 本身内部,而是在不同时间触发的消息处理程序内部。但是,TClientSocket 也可以在阻塞模式下运行,在这种情况下,异常会发生在 Open() 内部。
      • @Remy:奇怪,我在 Delphi 6(Build 6.163)中检查了两种模式(ClientType ctBlocking 和 ctNonBlocking),并且 try except 块没有任何效果。
      猜你喜欢
      • 2020-10-17
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2019-03-08
      • 2014-08-28
      • 2015-09-22
      相关资源
      最近更新 更多