ServerSocketClientError问题 |
答題得分者是:暗黑破壞神
|
xxxxzxx
一般會員 發表:21 回覆:49 積分:24 註冊:2004-11-15 發送簡訊給我 |
现象:当client端出现突然死机/停电时server端的ServerSocketClientError事件却侦测不到client端Error的发生,但是当kill-client端程序(不正常关闭)时则server端能在ServerSocketClientError事件中侦测到client端Error的发生.
设想:假使server端能在ServerSocketClientError事件中侦测到client端突然死机/停电时的Error.问题就简单了,但是经过多次测试都不行. 请教:各位大大,处理client端出现突然死机/停电等的若干问题server端该如何应对?
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
xxxxzxx
一般會員 發表:21 回覆:49 積分:24 註冊:2004-11-15 發送簡訊給我 |
|
xxxxzxx
一般會員 發表:21 回覆:49 積分:24 註冊:2004-11-15 發送簡訊給我 |
根据暗黑破壞神大大的提示问题得以解决.
代码如下:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
IdIcmpClient1.Host := ('pcname/pcip').AsString//判断它是否断线;
IdIcmpClient1.Ping;
Application.ProcessMessages;
if IdIcmpClient1.ReplyStatus.BytesReceived = 0 then
begin
//dosomething
end;
end;
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
我試用本方法解決了與你同樣的問題,試試吧!
procedure THalaServerForm.CheckUsersTimerTimer(Sender: TObject);
var
Count:integer;
begin
if CheckingIsProcessing then //是不是在作連線測試?
exit;
CheckingIsProcessing := true;
for Count := ClientList.Count - 1 downto 0 do //隨便送一個自訂的符號,去檢查每一個連線的用戶是否在線上?如果發生Socket error表示用戶不在,就把那個連線切掉!
begin
TempClientRecord := ClientList.Items[Count];
TempClientRecord^.Socket.SendText(PublicPara.CONNECT_TEST PublicPara.STRING_END);
end;
CheckingIsProcessing := false;
end;
另外請參閱站內連結:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=65652 -----------------------------------------------
Creation is the fundation of promotion.
|
xxxxzxx
一般會員 發表:21 回覆:49 積分:24 註冊:2004-11-15 發送簡訊給我 |
引言: procedure THalaServerForm.CheckUsersTimerTimer(Sender: TObject); var Count:integer; begin if CheckingIsProcessing then exit; CheckingIsProcessing := true; for Count := ClientList.Count - 1 downto 0 do begin TempClientRecord := ClientList.Items[Count];//能将TempClientRecord宣告帖一下吗?ClientList是什么呢?是listbox? TempClientRecord^.Socket.SendText(PublicPara.CONNECT_TEST PublicPara.STRING_END); end; CheckingIsProcessing := false; end;谢谢Stallion不过小弟是新手有些code还搞不明白,能否具体点儿谢谢. |
xxxxzxx
一般會員 發表:21 回覆:49 積分:24 註冊:2004-11-15 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
宣告一個記錄登入者資訊的型態結構及指標
type
PClient = ^Client; Client=record
Handle:integer; //客戶端Socket handle
Socket:TCustomWinSocket; //客戶端Socket
Address:string; //客戶端 IP
.... //加入其他你想要記錄的資訊
end; 另外在程式的CLASS私有區裡宣告
ClientRecord:PClient; //PClient結構指標
ClientList,TalkerList:TList; //串列結構用以儲存每一登入的使用者 以下知道該如何做了吧!但是建議要考量由於聊天室人數多寡以及發話流量的同步作業,SERVER端與CLIENT端處理接收與發送訓息的那個事件一定要用THREAD來寫,不然會丟失一大堆訊息,或者連SERVER都會掛掉! -----------------------------------------------
Creation is the fundation of promotion. 發表人 - stallion 於 2005/05/10 19:27:18
|
xxxxzxx
一般會員 發表:21 回覆:49 積分:24 註冊:2004-11-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |