运行几小时后报错,不能在该机再建立SOCKET,不知问题出在哪里?请大侠们帮我会诊!服务端源码   // 处理从前台发来的消息
Procedure TClientThread.HandleRecvClient;
  // var
  // ...
begin
  try
     if not Assigned(SocketStream) then
     begin
       SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
     end;
     FillChar(ReceiveBuffer, sizeof(ReceiveBuffer), 0);     try
     If SocketStream.WaitForData(5000) Then
     Repeat
         BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
         if BytesRead > 0 then
         begin
           ;   // ...... 
           // 正常处理
         end
         else
         begin
           ClientSocket.Close;    
           break;  // ?
         end;  // if BytesRead > 0
     Until  Not SocketStream.WaitForData(2000); 
    finally
      SocketStream.Free;
      // 客户端用非阻塞方式连接
      // 在这里加 ClientSocket.Close;会导致客户端SOCKET中断
    end;
   except
      ClientSocket.Close;    
   end;
end;Procedure TClientThread.ClientExecute;
begin
    while Not Terminated And ClientSocket.Connected Do
    begin
      Synchronize(HandleRecvClient);
   end;   
   ClientSocket.Close;
end;

解决方案 »

  1.   

    SocketStream    这个对象你在哪里声明的?此过程内还是文件中声明,还是全局的??
      

  2.   

    // 处理从前台发来的消息
    Procedure TClientThread.HandleRecvClient;
    var
      SocketStream : TWinSocketStream;就在此过程中声明
    如果声明为全局变量,那么每个线程都去用这个变量,更难以控制。
      

  3.   

    我不知道你是否使用了TClientSocket控件,如果使用了该控件,就会出现你所描述的现象。
    如果对症,可以再联系。
      

  4.   

    本人还是建议delphi的程序员象vc的程序员一样,在写socket的时候,建议使用win32 api,这样不仅速度快,而且很多问题可以避免,当我写一个高并发的socketserver时,也不会遇到此问题,10055是说明系统分配给你的socket资源已经over了,如果我们不能非常好的了解vcl最好还是换换方法
      

  5.   

    我不是楼主,但是现在程序长时运行也会出现10055的问题,不知怎么解决。
    win32 api怎么做呀,哪里有介绍吗?
      

  6.   

    添加如下代码试试看
    procedure TForm1.ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      ErrorCode := 0;
      Socket.Close;
    end;