在TServerClientThread中 如何处理客户端断线或者死机时。具体如下:(50分)

  • 主题发起人 主题发起人 eMetal
  • 开始时间 开始时间
E

eMetal

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TMyServerThread.ClientExecute;
var
Stream : TWinSocketStream;
Buffer : array[0 .. 9] of Char;
begin
while (not Terminated) and ClientSocket.Connected do
begin
try
Stream := TWinSocketStream.Create(ClientSocket, 60000);
try
FillChar(Buffer, 10, 0); { initialize the buffer }
if Stream.WaitForData(60000) then //当等待时,会停留在这里
begin
if Stream.Read(Buffer, 10) = 0 then //[red]问题:为什么当客户机死机时代码能继续执行到这里[/red]
ClientSocket.Close;
{ now process the request }
...
end
else
ClientSocket.Close; { if client doesn抰 start, close }
finally
Stream.Free;
end;
except
HandleException;

end;
end;
end;
 
没有遇到过这样的问题吗? 我查过了以前的一些帖子 但是没有找到答案
请高手赐教啊[?]
 
超时也可以说明对方断线,read数据为0也是对方离开的标志
 
while (not Terminated) and ClientSocket.Connected do
begin
try
Stream := TWinSocketStream.Create(ClientSocket, 60000);
try
if (Stream.WaitForData(60000)) then
begin
tempbuffer:=pBuffer ;
inc(tempbuffer, nHad);
count:=Stream.Read(tempbuffer^, nNeed );

if count = 0 then
begin
sleep(5);
ClientSocket.Close;
Terminate;
end
else
begin
nHad := nHad + count;
TriggerRecv;
end;
end
else
begin
sleep(2);
ClientSocket.Close;
end;
finally
Stream.Free;
end;

except
HandleException;
end;

end;


我试过了在当客户机死机时 在count:=Stream.Read(tempbuffer^, nNeed );处出错

 
对了,好象先要判断是否处于连接状态什么的,我很久以前用过,现在都忘光了
 
是否处于连接状态 具体是指谁的连接 clientsocket? stream?还是其他的 我看了
帮助关于Stream.WaitForData(60000)) 的 说是当clientsocket 准备好读或写时才为true
难道客户端死机了 也算准备好了?
 
WaitForData是用select判断是否有数据可以读,如果没有数据可读或者是断开连接
就会返回
 
在WaitForData返回你可以看对方是否断开连接
 
那该怎么样检查是否断了呢?
 
对方是否断开连接 具体是检查什么参数?
 
ClientSocket有个属性可以判断的,好象是connected什么的,我忘了
 
我试过了 应该不是connected
 
好像有Active属性,很久以前用的
 
to codehunter
不会吧,能有这个ACTIVE吗 没有也(自己看看帮助)
 
多人接受答案了。
 
后退
顶部