session_record=record
Used: boolean; { 会话记录是否可用 }
SS_Handle: integer; { 代理服务器套接字句柄 }
CSocket: TClientSocket; { 用于连接远程的套接字 }
Lookingup: boolean; { 是否正在查找服务器 }
LookupTime: integer; { 查找服务器时间 }
Request: boolean; { 是否有请求 }
request_str: string; { 请求数据块 }
client_connected: boolean; { 客户机联机标志 }
remote_connected: boolean; { 远程服务器连接标志 }
end;
//===========
猛料上有篇代理的例子,有类似的你看看
// 被代理端连接到代理服务器后 ,建立一个会话 ,并与套接字绑定…
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j: integer;
begin
j:=-1;
for i:=1 to sessions do { 查找是否有空白项 }
if not session[i-1].Used and not session[i-1].CSocket.active then
begin
j:=i-1; { 有 ,分配它 }
session[j].Used:=true; { 置为在用 }
break;
end
else
if not session[i-1].Used and session[i-1].CSocket.active then
session[i-1].CSocket.active:=false;
if j=-1 then
begin { 无 ,新增一个 }
j:=sessions;
inc(sessions);
setlength(session,sessions);
session[j].Used:=true; { 置为在用 }
session[j].CSocket:=TClientSocket.Create(nil);
session[j].CSocket.OnConnect:=ClientSocket1Connect;
session[j].CSocket.OnDisconnect:=ClientSocket1Disconnect;
session[j].CSocket.OnError:=ClientSocket1Error;
session[j].CSocket.OnRead:=ClientSocket1Read;
session[j].CSocket.OnWrite:=ClientSocket1Write;
session[j].Lookingup:=false;
end;
session[j].SS_Handle:=socket.socketHandle; { 保存句柄 ,实现绑定 }
session[j].Request:=false; { 无请求 }
session[j].client_connected:=true; { 客户机已连接 }
session[j].remote_connected:=false; { 远程未连接 }
edit1.text:=inttostr(sessions);
end;
// 被代理端断开时…
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j,k: integer;
begin
for i:=1 to sessions do
if (session[i-1].SS_Handle=socket.SocketHandle) and session[i-1].Used then
begin
session[i-1].client_connected:=false; { 客户机未连接 }
if session[i-1].remote_connected then
session[i-1].CSocket.active:=false { 假如远程尚连接 ,断开它 }
else
session[i-1].Used:=false; { 假如两者都断开 ,则置释放资源标志 }
break;
end;
j:=sessions;
k:=0;
for i:=1 to j do { 统计会话数组尾部有几个未用项 }
begin
if session[j-i].Used then
break;
inc(k);
end;
if k>0 then { 修正会话数组 ,释放尾部未用项 }
begin
sessions:=sessions-k;
setlength(session,sessions);
end;
edit1.text:=inttostr(sessions);
end;