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

請教ServerSocket&From的事件斷線問題!

答題得分者是:h@visli
runangel
一般會員


發表:4
回覆:2
積分:1
註冊:2005-07-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-19 18:57:57 IP:220.130.xxx.xxx 未訂閱
各位大大好:   小弟最近遇到一個問題:利用ServerSocket的元件來寫一個類似聊天室程式,然後力用ServerSocket事件中的ServerSocket1ClientDisconnect&ServerSocket1ClientError斷線及利用From的Close事件來斷線。可是卻遇到了如圖的情形。第一條黑線是連上線後的情形,當我利用上述ServerSocket事件來斷線此連線便完全斷線,不會有第2條黑線情形。可是如果我用From的Close事件來斷線,便會變成第2條黑線中的state->TIME_WAIT。想請教各位大大我程式,那邊寫的不正確才會造成此問題!!還請各位大大教導一下謝謝!!如問的不清楚還請見諒! 程式段如下: void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { AnsiString buf; buf = DateTimeToStr(Now()); buf += " " + Socket->RemoteAddress + "\tDisconnected."; Memo1->Lines->Add(buf); Num--; if (Num > 0) StatusBar1->Panels->Items[0]->Text = IntToStr(Num) + " Client Connected."; else StatusBar1->Panels->Items[0]->Text = "Listening..."; } void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { AnsiString buf; Memo1->Lines->Add(AnsiString("Error:")+ErrorCode); ErrorCode = 0 ; for(int i=0; iSocket->ActiveConnections; i++) { if(Socket->RemoteAddress==ServerSocket1->Socket->Connections[i]->RemoteAddress) { buf = DateTimeToStr(Now()); buf += " " + Socket->RemoteAddress + "\tDisconnected."; Memo1->Lines->Add(buf); Num--; if (Num > 0) StatusBar1->Panels->Items[0]->Text = IntToStr(Num) + " Client Connected."; else StatusBar1->Panels->Items[0]->Text = "Listening..."; ServerSocket1->Socket->Disconnect(i); } } } void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { for(int i=0; iSocket->ActiveConnections; i++) { ServerSocket1->Socket->Disconnect(i); } } 還在程式這條路到處碰撞的初心者上...>"<
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-19 19:43:26 IP:211.22.xxx.xxx 未訂閱
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 
 for(int i=0; iSocket->ActiveConnections; i  )
 {
  ServerSocket1->Socket->Connections[i]->Close(); //改成這樣看看!
 }
}    
------------------- 學,然後知不足。 發表人 - stallion 於 2005/07/19 19:44:35
runangel
一般會員


發表:4
回覆:2
積分:1
註冊:2005-07-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-20 09:46:45 IP:220.130.xxx.xxx 未訂閱
Stallion大大謝謝妳的教導小弟用此方法後,一樣會有TIME_WAIT的情形。上篇忘了說我是在MS-DOS模式下用打Netstat指令去看的在此說聲抱歉 小弟也在用過了下面這幾種方法仍然不行!還請各位大大教導謝謝。 >>>>>>>>>>>"<
runangel
一般會員


發表:4
回覆:2
積分:1
註冊:2005-07-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-28 13:53:17 IP:220.130.xxx.xxx 未訂閱
Stallion大大妳低答案是可以的謝謝你,只是如果OS是用windows xp一樣是不行的(小弟都是用xp)!!不知道為何會這樣不知有那個大大了解可以幫我解答一下嗎?謝謝
h@visli
資深會員


發表:101
回覆:417
積分:418
註冊:2004-02-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-03-27 15:06:27 IP:121.35.xxx.xxx 訂閱
你說的這種情況我剛才也測試了一遍,在XP下確實存在。
但我用:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
ServerSocket1.Socket.Connections[i].Close;
ServerSocket1.Close;
end;
直接關閉所有連接,依然會出現TIME_WAIT狀態顯示。但在Windows 2000下
就不會有該現象。後來我又換用Synapse庫來測試,也同樣存在該問題。

所以我分析,這應該不是我們的程序代碼問題,而是netstat.exe的原因。
Win XP下的netstat.exe與Win 2000下的netstat.exe已不相同。
如果我們使用netstat -o 來顯示,則可以看到TIME_WAIT時, PID(進程ID)
已變為0,說明我們的程序正常退出(或斷開Socket連接)。而且,過一段時
間後,再用netstate來看,則TIME_WAIT那條線就不會再顯示了。

我建議大家使用Tcpview.exe來代替netstate.exe查看連接列表。
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-03-27 20:18:20 IP:220.131.xxx.xxx 訂閱
建議你把 TCP/IP 的書拿起來K一下。
你該了解什麼是 TIME_WAIT。
那你就會了解你的程式為什麼會在 netstat 上面看到那樣的狀態了。^_^
這個算是大哉問。應該說起來會是一大篇。
所以建議你去看那個 TCP/IP 那幾本算是聖經的書了。^^

===================引 用 文 章===================
erverSocket1ClientDisconnect&ServerSocket1ClientError斷線及利用From的Close事件來斷線。可是卻遇到了如圖的情形。第一條黑線是連上線後的情形,當我利用上述ServerSocket事件來斷線此連線便完全斷線,不會有第2條黑線情形。可是如果我用From的
系統時間:2017-12-12 10:29:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!