全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2188
推到 Plurk!
推到 Facebook!

关于Indy的TidTCPServer连接问题

尚未結案
breathsoft
一般會員


發表:1
回覆:3
積分:0
註冊:2008-02-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-02-25 13:28:42 IP:221.226.xxx.xxx 訂閱
TidTcpServer接受connect客户端连接是没有问题的。但客户端退出以后没有触发disconnect。这个问题如何解决。
我有个思路就是客户端在断开时,发送个退出的请求信息给客户端,我用抓包工具,看到客户端把退出的请求信息发送出去了。但服务器端没有接收到。请问如何解决。
------
因为专业,所以安全;
因为安全,所以成功。
breathsoft
一般會員


發表:1
回覆:3
積分:0
註冊:2008-02-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-02-25 13:32:41 IP:221.226.xxx.xxx 訂閱
connect 代码如下:
procedure TfrmMain.KytServerConnect(AThread: TIdPeerThread);
var
Client: PClient;
begin
try
MemLog.Lines.Add(FormatDateTime('yyyy-mm-dd hh:mm:ss',now) ' ' AThread.Connection.Socket.Binding.PeerIP ':' IntToStr(AThread.Connection.Socket.Binding.PeerPort) ' 客户端连接');
Client := new( PClient );
Client.UserName := '';
Client.RealName := '';
Client.PassWord := '';
Client.IP := AThread.Connection.Socket.Binding.PeerIP;
Client.Port := AThread.Connection.Socket.Binding.PeerPort;
Client.LinkTime := now; //监控周期
Client.LoginTime := now;
Client.ActiveTime := now;
Client.Status := '未登录';
Client.Login := false;
Client.Mac := AThread.Connection.Socket.SocksInfo.Username;
Client.Thread := AThread;
AThread.Data := TObject(Client); //指到 athread的指针中
except
on E:exception do
begin
if strServ_Error='是' then
MemLog.Lines.Add(FormatDateTime('yyyy-mm-dd hh:mm:ss',now) ' ' AThread.Connection.Socket.Binding.PeerIP ':' IntToStr(AThread.Connection.Socket.Binding.PeerPort) ' 连接错误:' E.Message);
AThread.Terminate;
end;
end;
try
KytClients.LockList.Add(Client);
clientNumber := KytClients.LockList.Count;
finally
KytClients.UnlockList;
end;
end;

Disconnect代码如下:
procedure TfrmMain.KytServerDisconnect(AThread: TIdPeerThread);
var
Client:PClient;
begin
//KytServer.Threads.LockList;
try
Client := PClient(AThread.Data);
if not isvalidmemptr(Client) or (Client=nil) then
exit;
if Client.Login then
MemLog.Lines.Add(FormatDateTime('yyyy-mm-dd hh:mm:ss',now) ' ' Client.UserName ' 断开连接')
else
MemLog.Lines.Add(FormatDateTime('yyyy-mm-dd hh:mm:ss',now) ' ' Client.IP ':' IntToStr(Client.Port) ' 断开连接');
AThread.Data := nil;

if not AThread.Terminated then
AThread.Terminate;
if not isvalidmemptr(Client) or (Client=nil) then
exit;

FreeMem(Client);
except
on E:Exception do
begin
if strServ_Error='是' then
MemLog.Lines.Add(FormatDateTime('yyyy-mm-dd hh:mm:ss',now) ' ' AThread.Connection.Socket.Binding.PeerIP ':' IntToStr(AThread.Connection.Socket.Binding.PeerPort) ' 断开错误:' E.Message);
if not AThread.Terminated then
AThread.Terminate;
end;
end;

try
KytClients.LockList.Remove(Client);
clientNumber := KytClients.lockList.Count;
finally
KytClients.UnlockList;
end;
end;
------
因为专业,所以安全;
因为安全,所以成功。
breathsoft
一般會員


發表:1
回覆:3
積分:0
註冊:2008-02-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-02-25 13:34:19 IP:221.226.xxx.xxx 訂閱
有什么办法,检测服务器连接的所有客户端,是否异常,
如客户端异常断开。或服务器没有收到断开的请求,那服务器端的连接有什么状态变化么。
------
因为专业,所以安全;
因为安全,所以成功。
系統時間:2024-04-25 13:03:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!