unit U_ActiveConnections;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;type
  TForm1 = class(TForm)
    ServerSocket: TServerSocket;
    Button1: TButton;
    ed_cnt: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket.Active:=true;
end;procedure TForm1.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  ed_cnt.Text:=inttostr(ServerSocket.Socket.ActiveConnections);
end;procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
ed_cnt.Text:=inttostr(ServerSocket.Socket.ActiveConnections);
end;procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  // 对  socket.ReceiveText  的处理
  socket.SendText('ok');
  //客户端收到  ok  断开 end;
end.
这个是一个简单的服务端,客户端采用短连接方式传送数据,收到‘ok’后断开连接,再有数据的时候再连接服务端。现在的现象是:当客户端断开连接的时候,ServerSocket.Socket.ActiveConnections的数量偶尔会有减小,大部分时间还是增加,并且服务端所用内存也在增加。这个问题怎么解决?在就是客户端连接上后,服务端所建立的socket对象是不是在客户端断开的时候自动free,如果不是怎么解决这个问题?
谢谢!

解决方案 »

  1.   

    还有连接的客户端有80个左右,现在的现象就是ServerSocket.Socket.ActiveConnections的数量不断增长,偶尔会有小范围降低,内存也长,假如现在内存增长到10268K,ServerSocket.Socket.ActiveConnections的数量为100,当把ServerSocket.active的值变成false,然后再ServerSocket.active:=true;这样操作后,ServerSocket.Socket.ActiveConnections的数量变成0,然后又开始增长,偶尔会有小范围降低;内存也停留在10268K,当ServerSocket.Socket.ActiveConnections的值超过上次的100的时候,内存又开始增长。
    期待高人指点。分可以再加!!!!
      

  2.   

    你的代码在OnError事件代码里面加上Socket.Close;吧..
      

  3.   

    OnError事件代码里面加上Socket.Close;
    是处理掉出错的,可是有些正断开的socket怎么能处理掉?
      

  4.   

    对端SOCKET单边CLOSE,或者链路非正常断开,而ActiveConnections数未减少,这是已方SOCKET并没CLOSE.
    这种情况只能通过数据发送或接收数据时才能即时知道,
    如果是阻塞方式,通常是通过TRY语句抓住发送或接收数据时抛出的异常,CLOSE掉SOCKET.
    如果是非阻塞方式,如你那样,则可以在ONERROR事件中,CLOSE掉SOCKET..使自己单边的SOCKET主动关掉.
      

  5.   

    这里还有一个现象:在ONERROR事件中,CLOSE掉SOCKET问题依然存在。后来我改成这样:当ActiveConnections达到一定数量N的时候将ServerSocket.active:=false;然后再ServerSocket.active:=true;,这时内存停止增长,但是ActiveConnections的值从0又开始增长,直到ActiveConnections的值超过N内存又开始增长。
    这个现象怎么解决?
    请赐教,谢谢!