線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2484
推到 Plurk!
推到 Facebook!

請問一下IDUDPSERVER的問題

尚未結案
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-05 16:13:35 IP:59.121.xxx.xxx 未訂閱
當我用BCB的IDUDPServer時,當我用IDUDPServer1->Active = false來斷線時,當我重新用IDUDPServer1->Active = true時,為什麼對方仍在送資料時,我的程式會收不到資料,請問一下是什麼問題呢
Stallion
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-06 11:04:52 IP:211.22.xxx.xxx 未訂閱
所謂重傳是CLIENT端或SERVER端知道對方已經離線後又知道重新上線了,重新建立了CONNECTION,你少的應該就是這道程序,因為SERVER端重新上線後不知道還有一個CLIENT端(之前已經LOST CONNECTION),所以無法互傳訊息資料。 ---------------------------------------------- We will either find a way, or make one. -Hannibal -。
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-08 15:37:04 IP:211.22.xxx.xxx 未訂閱
謝謝Stallion兄的解答,不過我找了一下TIDUDPSever的方法中並沒有重新建立connect的方法及屬性,然後我的情況是對方會一直利用UDP的方式丟到我的電腦,不管我有沒有收到,所以這樣的情況下,我除了需讓IDUDPServer1->Active = true,還需作什麼動作嗎,謝謝
Stallion
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-08 20:01:24 IP:211.22.xxx.xxx 未訂閱
在UDP模式,Client或Server端不管是正常或不正常得離線,都要能明確(至少有一方)能掌握,將對方或自己的的Socket給Close掉,因為UDP是Connection less的,依照你的狀況,是Client已經不知道Server已經Down了,還在對原來的Server Socket Handle送東西,這樣解釋希望對你有幫助。 ----------------------------------------------
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-08 20:35:38 IP:210.68.xxx.xxx 未訂閱
基本的解決方式就是 再開一個 Connection 做 monitor 用, 由client 定期向 server 發送, server 收到後則會回應, 這樣就可以在斷線後一定時間內察覺斷線再重新建立連線....
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-09 11:14:43 IP:211.22.xxx.xxx 未訂閱
再次謝謝Stallion兄及malanlk兄的解答,不過我想可能我的問題不夠清楚,或是我的理解答力太差,在這邊跟兩位說抱歉,尤其是Stallion兄,浪費他這麼多時間。 我的問題是在當我使用IDUDPServer如何要能夠在我停止連線後(IDUDPServer1->Active = false),如何能重新連線,因為在用了IDUDPServer1->Active = true 後,即使對方不停丟資料進來,我也收不到資料,即使IDUDPServer1->Active 的狀態已經是true 了。
Stallion
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-09 20:46:50 IP:211.22.xxx.xxx 未訂閱
可以就像manlanlk兄所提,由CLIENT端每隔一段時間就往SERVER發出確認是否存在的自訂符號,如果SERVER端存在就回覆,否則CLIENT就要決定多久沒有收到SERVER端的回覆,就將自己的SOCKET CLOSE,重新CONNECT SERVER。 ---------------------------------------------- We will either find a way, or make one. -Hannibal -。
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-10 14:58:12 IP:211.22.xxx.xxx 未訂閱
謝謝Stallion兄,那我可以在請問一下,可以由Server端作這樣的動作嗎,因為我是Server端,收client端的資料,我的情況是當我斷線後再重新連線時,即使client持續丟資料,我還是收不到,除非我把整個程式重新關掉再啟動,才能收到資料,這是IDUDPServer 的問題嗎,還是只是把IDUDPServer的Active屬性變成True是不夠的,謝謝
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-10 17:26:52 IP:203.69.xxx.xxx 未訂閱
Active 設為 true 後    
for (i=0;i    這樣試試....     
        
Stallion
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-10 20:44:18 IP:211.22.xxx.xxx 未訂閱
引言: 謝謝Stallion兄,那我可以在請問一下,可以由Server端作這樣的動作嗎,因為我是Server端,收client端的資料,我的情況是當我斷線後再重新連線時,即使client持續丟資料,我還是收不到,除非我把整個程式重新關掉再啟動,才能收到資料,這是IDUDPServer 的問題嗎,還是只是把IDUDPServer的Active屬性變成True是不夠的,謝謝
1.你的問題,我之前已經回答你了,因為在UDP模式,Client或Server端不管是正常或不正常得離線,都要能明確(至少有一方)能掌握,將對方或自己的的Socket給Close掉,因為UDP是Connection less的,依照你的狀況,是Client已經不知道Server已經Down了,還在對原來的Server Socket Handle送東西,所以你的Server再連上線,已經不是原來的Socket Handle,因此你的Client發送東西,Server 端當然收不到。 2.綜上,相反的,當Client端發現Server端不見時,或Server端剛啟動時,要將自己先結束,再重新連上Server。向Malanlk兄做的一樣,是由Server端剛啟動後,先清除所有的連線。 ---------------------------------------------- We will either find a way, or make one. -Hannibal -。
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-12 11:44:09 IP:211.22.xxx.xxx 未訂閱
再次謝謝malanlk及Stallion兄,讓我對UDP有較深入的了解,不過當我在Server 關閉所有的Socket後,程式的訊息確顯示operate on nonsocket,請問一下我要如何去做重新連上clinet的Socket Handle的動作,我試了許多方法,都告訴我無作用socket,請問一下我該如何作呢,再次謝謝。
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-08-12 12:29:54 IP:203.69.xxx.xxx 未訂閱
這是 Indy 9 Help 中對 IUDPServer.Active 的解說 ================================================== Active is a Boolean property used to indicate that the socket binding has been allocated. Note that Active will always return False when using the IDE.    這是 Indy 10 Help 的解說 =================================================== Active is a Boolean property used to indicate if the socket binding has been allocated for the UDP client.    Setting Active to True causes the socket handle in Binding to be allocated. Set other property values, like BufferSize and IPVersion, prior to setting Active to True. Setting Active to False will free the socket handle in Binding. Setting Active to True in the IDE (at design-time) has no effect other than storing the property value to be used at runtime. The UDP component cannot allocate its socket handle at design-time ========================================== 先以 Indy 10 的說法來做, 當斷線後連線恢復後, 先將 Active設為 False, 再設回 True 試試. 如果不行, 表示 Indy 9,10 運作模式不一樣了, 之前給你的建議有可能是釋放時 Active=True 造成的, 正確應該是 先設 Active=False ==> 清除 Socket==>Active=True; 如果還是不行, 那就是在清除後, 當Active設為 True 時, 沒有自動再重新配置 Socket..... 這比較棘手, 先試試, 結果說一下...
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-08-12 13:29:57 IP:211.22.xxx.xxx 未訂閱
謝謝malanlk兄,我c 的版本應該是INDY9的,我先設 Active=False ==> 清除 Socket==>Active=True,結果收不到資料,用indy10的作法先讓Active = false , 再讓Active =true ,結果也是收不到資料。以上報告。
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-04-18 17:32:42 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-06 5:17:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!