急300分再线等待,问题解决立马给分,各位高手帮忙看看(300分)

  • 主题发起人 主题发起人 rezin
  • 开始时间 开始时间
R

rezin

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器端
1.打开按钮事件
ServerSocket.Open ;
2.procedure Tfrm_main.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j:integer;
begin
j:=-1;
frm_main.Caption := inttostr(sessions);
for i:=0 to sessionsdo
begin
//在原有的客户端连接数组中有中断的客户端连接
if not session.CUsed then
begin
session.CHandle := Socket.SocketHandle ;//客户端套接字句柄
session.CSocket := Socket;
//客户端套接字
session.CName := Socket.RemoteHost ;
//客户端计算机名称
session.CAddress := Socket.RemoteAddress ;//客户端计算机IP
session.CUsed := True;
//连接数组当前位置已经占用
session.CTime := now;
session.CNum := 0;
//当有新客户段连接上时,将其连接信息添加到列表中
ASG.Cells[0,i+1]:=inttostr(i+1);
ASG.Cells[1,i+1]:=Socket.RemoteHost;
ASG.Cells[2,i+1]:=Socket.RemoteAddress;
frm_main.Caption := frm_main.Caption+inttostr(i);
j := 0;
if session.CUsed then
ASG.Cells[5,i+1]:= '已连接'
else
ASG.Cells[5,i+1]:= '未连接';
Break;
end;
end ;
if j=-1 then
begin
inc(sessions);
i := sessions;
session.CHandle := Socket.SocketHandle ;
session.CSocket := Socket;
session.CName := Socket.RemoteHost ;
session.CAddress := Socket.RemoteAddress ;
session.CUsed := True;
session.CTime := now;
session.CNum := 1;
asg.AddRow ;
ASG.Cells[0,i+1]:=inttostr(i+1);
ASG.Cells[1,i+1]:=Socket.RemoteHost;
ASG.Cells[2,i+1]:=Socket.RemoteAddress;
frm_main.Caption := frm_main.Caption + 'b';
if session.CUsed then
ASG.Cells[5,i+1]:= '已连接'
else
ASG.Cells[5,i+1]:= '未连接';
end;

end;
3.//当客户端断开连接时
procedure Tfrm_main.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j:integer;
begin
for i:=0 to sessionsdo
begin
if (session.CHandle = Socket.SocketHandle) and session.CUsed =true then
begin
session.CHandle :=0;
session.CUsed := False;
Break;
end;
end;
//删除断开连接的机器在列表中的信息
end;
二 客户段就写一个断开按钮
clientsocket.close;
问题是:
1.在客户段连接时正常,
2.如果只用一个客户段也正常,但是同时存在两个以上客户段时,按照我下面的操作方式,服务器段会抱 Access violation at address ********.Read of adress ********错误
操作方式如下:
同时打开两个客户端,然后将第一个客户段关闭在打开,反复操作几次,在到另外的机器上关闭另一个客户端时就会报上述错误
 
打开2个Delphi,分别运行,跟踪一下
 
easykoala能说的更明白点吗?该怎么操作
 
打开2个Delphi,分别运行两个客户端,跟踪一下
 
我在两太机器上都装上DELPHI吗
能给我细致说下吗
[:)]
 
怎么跟踪
我的客户段是不报错的
就服务器段报错
 
服务器端报错就跟踪那一台服务端。
启动delphi,运行服务器端,报错时按F8继续跟踪。。。
 
procedure Tfrm_main.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var i:integer;
begin
for i:=0 to sessionsdo
begin
//取得匹配的客户端
if session.CSocket.ReceiveText<>'' then
begin
if session.CHandle = Socket.SocketHandle then
begin
session.CTime := now;
asg.Cells[6,i+1]:= datetimetostr(session.CTime);
break;
end;
end;
end;
end;
我跟踪了,报错后按F8到着一部了,麻烦easykoala看下
加上这段话为什么会报错
 
十有八九是对象已经释放掉了
报错后按F8后,看一下Call Stack
是哪一句错?
 
按F8运行到
for i:=0 to sessionsdo
这一行
 
还是不行 Tfrm_main.serversockeclientread(???,$1018778)
这还怎么做啊
 
跟踪结果是上面这个,可以找到错误位置是
for i:=0 to sessionsdo

但是我不清楚是为什么错
难道是sessions被改成不活动状态就不行了吗
我也没有释放他啊
 
好象只看到sessions增加
session呢
 
后退
顶部