因为 我的 客户端 要 实时的 与 服务器端 进行数据传输所以使用Timer写了个 客户端自动连接服务器的 方法但是当客户端在使用(ClientSocket.Open)到第3900-4000次之后 就会报'Windows Socket error:由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。(10055),On API 'Connect''.请高手帮忙解决一下啊!

解决方案 »

  1.   

    估计就是在Timer事件写了:
    Client := TClientsocket.Create...
    Client...
    Client.Open...
    忘了写Client.Free然后运行一段时间,系统资源不够,就出现这错误了。
      

  2.   

    如果是连接失败,然后重复尝试连接的话,可以在onerror事件里加入以下代码:
      ErrorCode := 0;
      Socket.Close;//这里吧socket关闭释放句柄资源
      

  3.   

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      T_Cli.Interval:=1000;
      T_Send.Enabled:=True;
    end;procedure TForm1.T_CliTimer(Sender: TObject);
    begin
      if not ClientSocket.Active then
      begin
        ClientSocket.Open;
      end
      else
      begin
        T_Send.Enabled:=False;
      end;
    end;procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    begin
      T_Send.Enabled:=True;
      ErrorCode:=0;
      Socket.Close;
    end;我的代码是这样的,  请问有什么问题吗?  
    顺便问下, Socket缓冲区怎么清空!
    因为 我客户端 连上服务器之后就会跟 服务器发送消息, 
    所以 我的客户端不能Free掉。
    请高手帮帮忙!
      

  4.   

    在 ClientSocket 的OnLookup事件里,调整Socket的参数 (uses WinSock):
    procedure TForm1.ClientSocket1Lookup(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      Bo_Dontlinger : BOOL;
    begin
      Bo_Dontlinger := True;
      SetSockOpt(Socket.SocketHandle, SOL_SOCKET, SO_DONTLINGER, @Bo_Dontlinger, sizeof(BOOL));
    end;
      

  5.   

    问题解决了
    多谢各位的帮忙附上解决了的代码
    procedure TForm1.FormCreate(Sender: TObject); 
    begin 
      T_Send.Interval:=1000; 
      T_Send.Enabled:=True; 
      ConnUse:=True;  //这个是全局的
    end; procedure TForm1.T_CliTimer(Sender: TObject); 
    begin 
      if ConnUse then  //判断客户端Disconnect方法是否执行完
      begin
        if not ClientSocket.Active then 
        begin 
          ClientSocket.Open; 
        end 
        else 
        begin 
          T_Send.Enabled:=False; 
        end; 
        ConnUse:=False;  //每次执行都将初始化Disconnect方法执行状体
      end;
    end; procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket; 
      ErrorEvent: TErrorEvent; var ErrorCode: Integer); 
    begin 
      T_Send.Enabled:=True; 
      ErrorCode:=0; 
      Socket.Close; 
    end; procedure TForm1.ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      ConnUse:=True;    
    end;procedure TForm1.ClientLookup(Sender: TObject;
      Socket: TCustomWinSocket);
    var 
      Bo_Dontlinger : BOOL;
    begin 
      Bo_Dontlinger := True; 
      SetSockOpt(Socket.SocketHandle, SOL_SOCKET, SO_DONTLINGER, @Bo_Dontlinger, sizeof(BOOL));
    end;