Window Socket API function Error 
当socket函数出现错误时,一般都会raise这些异常,
所以在对ClientSocket.Socket.Proc/ Func 加上try,应该可以捕获。
                  
  Code := WinSock.send(FSocket, Buf, Len, 0) ;
  if Code <> SOCKET_ERROR then
  begin
    Code :=WSAGetLastError;
    raise Exception.CreateFmt('Windows socket error: %s (%d), on API ''%s''',[SysErrorMessage(Code), Code,'send' );
  end;
const
  WSABASEERR              = 10000
  WSAECONNABORTED         = (WSABASEERR+53);
  WSAECONNRESET           = (WSABASEERR+54);

解决方案 »

  1.   

    在我的程序中都已经 try 了,
    可是有时还是出现异常,如果两台机器正在通讯,这时一台机器突然宕掉,
    这中异常能捕到吗?
      

  2.   

    可以在ClientSocket1.OnError
    这个事件在raise之前。
    procedure ClientSocket.OnError
    begin
      ShowMessage('socket error');
      Abort;  //中止。
    end;
      

  3.   

    谢谢 copy_paste:
    那么,WSAECONNABORTED WSACONNERESET 这两个异常,表示什么含义呢?
    换句话说,什么时候被触发呢?
      

  4.   

    我的总是 ServerSocket 出现 api "Send" 异常!
      

  5.   

    to copy_paste:
      能告诉我你的EMAIL和OICQ吗?谢谢
      

  6.   

    我的程序比较庞大,采集机timer1(1秒) 定时向各个工作站发送数据包(含大量数据)
    出现问题也总在采集机,接受端无任何问题
      

  7.   

    你的服务端是不是可以把信息用文件或什么保存下来,然后一点点发。不然1秒就全部发出给客户怪不得,send不成功。
      

  8.   

    可买这本书:
     《Windows Sockets  网络程序设计大全》 清华大学出版社 29.50元
    对出错得意思有注明。
    [email protected]
      

  9.   

    看VCL最好,而且window socket的API也不是很多,只是VCL把它们封装的太多了。 加了很多事件,异常处理,所以不如看VCL来的快。
      

  10.   

    10053是超时或其他错误引起连接中断
    10054是连接被远程端重启错误
    在OnError事件中关闭连接然后重起并将ErrorCode置0,可解决此问题
      

  11.   

    在Delphi帮助中有各个错误代码含义
    Error Codes帮助项
      

  12.   

    在Delphi帮助索引中写入WinSock error codes
    各种错误信息全有
    捕捉错误:在OnError中
    begin
      ....
      ErrorCode:=0; //对于某些错误将不在产生异常
    end;
    对于一些严重错误,只有修改原代码
      

  13.   

    //
    在ScktComp定义了全局变量,这个可以由用户来编写Socket的出错处理。
    你只要调用scktComp.SetErrorProc(mySocketError);///////////////////////////////////////////////////////////////////////////
    //VCL scktComp.pas TSocketErrorProc = procedure (ErrorCode: Integer);threadvar
      SocketErrorProc: TSocketErrorProc;function SetErrorProc(ErrorProc: TSocketErrorProc): TSocketErrorProc;
    begin
      Result := SocketErrorProc;
      SocketErrorProc := ErrorProc;
    end;//checkSocketResult是scktcomp.pas私有函数,不能调用,
    //如果Socket出错,大都分的错误都在这里raise.
    function CheckSocketResult(ResultCode: Integer; const Op: string): Integer;
    begin
      if ResultCode <> 0 then
      begin
        Result := WSAGetLastError;
        if Result <> WSAEWOULDBLOCK then
          if Assigned(SocketErrorProc) then  //如果用户为写了处理过程,则调用用户的处理过程,不然我就raise Window Socket Error.
            SocketErrorProc(Result)
          else raise ESocketError.CreateResFmt(@sWindowsSocketError,
            [SysErrorMessage(Result), Result, Op]);
      end else Result := 0;
    end;//////////////////////////////////////////////////////////////////////////
    //顺手写个。没调试。
    type 
      tform1 = class(tform)
      private
        procedure mySocketErrorProc(ErrorCode: Integer);
        ...
      end;procedure TForm1.OnCreate(Sender: TObject);
    begin
      scktComp.SetErrorProc(mySocketError);  
    end;//用你的处理过程,来代替VCL的出错过程。---------------------
    procedure TForm1.mySocketErrorProc(ErrorCode: Integer);
    var
      S: string;
    begin
      S := SysUtils.SysErrorMessage(ErrorCode);
      Windows.MessageBox(Handle, PChar(S), 'Socket错误', MB_OK + MB_ICONERROR);  
    end;
      

  14.   

    谢谢大家的支持!
    看来大家对WinSock都有比较深刻的研究啊,尤其是copy_paste,这里多谢了,你的代码我
    会用心研究的,你的QQ我怎么查不到啊!
      

  15.   

    To copy_paste:
    我怎么与你联系?
    我的QQ:45970397