Delphi 获取异步套接字错误10049,即使我使用try..except

Delphi 获取异步套接字错误10049,即使我使用try..except,delphi,sockets,exception-handling,try-finally,tclientsock,Delphi,Sockets,Exception Handling,Try Finally,Tclientsock,当我运行我的程序(在调试器/ide之外)时,我得到错误异步套接字错误10049,我不应该收到一个消息对话框:“错误”?请参阅下面的代码 begin try ClientSocket1.open; except showmessage('error'); end; end; 我做错了什么?TClientsocket组件(已经)使用异步通信模型,因此异常可能不会在Open方法中抛出,而是在接收传入数据的消息/事件处理方法中抛出 更新:如果我输入一

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

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

我做错了什么?

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

更新:如果我输入一个无效的IP地址,如1.2.3.4,我可以用Delphi 6和给定的代码来复制它


要解决这个问题,我将使用一个TCP/IP库,比如Indy或(两者都有一个通用的TCP客户端组件)。

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

ErrorCode参数将包含WinSock错误代码 如果要使错误静音,可以将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;
我希望这有帮助


Gaetan Siry

当代码连接到服务器(在其他程序中)时,代码工作正常,但当服务器不在时,我得到的是10049错误,而不是我想要的(带有消息“error”的消息框),为什么建议移动到其他库?下面列出了用户问题的解决方案。我有一些商业项目已经使用TServerSocket和TClientSocket很多年了,它们仍然可以正常工作。我知道它们不能使用Unicode,但除此之外,我看不出它们有任何问题,而且它们很容易使用。简单的规则:如果某些东西被声明为“不推荐使用”,请尽早开始寻找替代品。(在下一个版本中可能不可用或完全中断。)@mjustin:没错,当TClientSocket在非阻塞模式下工作时,异常不会发生在Open()本身内部,而是在不同时间触发的消息处理程序内部。但是,TClientSocket也可以在阻塞模式下运行,在这种情况下,异常会发生在Open()内部。@Remy:奇怪,我在Delphi 6(Build 6.163)中检查了这两种模式(ClientType ctBlocking和ctNonBlocking),而try-except块对这两种方式都没有效果。