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

兩台pc透過ClientSocket互傳資料時,如果有一台網路線拔掉,要如何判斷網路斷線

尚未結案
ORISBOY
一般會員


發表:11
回覆:7
積分:3
註冊:2004-10-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-25 11:42:30 IP:211.72.xxx.xxx 未訂閱
如題,如果兩台pc透過ClientSocket互傳資料時,我將接收的程式寫在onRead中,資料接收時一直都很順利,但是如果將網路線拔掉,我要如何去判斷已經斷線。 我是ORIS,大家好
------
我是ORIS,大家好
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-25 12:45:00 IP:211.20.xxx.xxx 未訂閱
我都這樣處理 參考看看 try ClientSocket ...... except 斷線時後的訊息 end; 數學 程式 經驗=不懂^^
microbean
初階會員


發表:1
回覆:43
積分:38
註冊:2004-04-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-25 17:48:01 IP:211.21.xxx.xxx 未訂閱
網路的資料傳輸過程會存在很多變數 , 通常除了 exception handle 外, 必需設計兩種概念 , 1. Timeout : 不管連線是否斷掉 , 網路程式都應該去定義這件事情 , 當資料沒有在預定的時間到達時 , 就應該去做例外處理. 2. 偵測連線 : 以你說的拔網路線的情形來說 , 大部份 是不會有 error 產生的,我們必須要在這兩個端點中間, 做固定時間的偵測 , 偵測的方法大概有兩種 , 1. 建立額外的 alive connection , 這個 connection 的用途 就是用來檢查雙方是否都alive , 雙方在固定的時間內 , 送固定的檢查資料, 當任何一方發現對方沒有按照規定時 , 就去做例外處理. 2. 固定時間去問特定的外部 server 是否有回應 , 例如用 HTTP 去抓某個網站的網頁 , 或是用 ICMP , 或是...等, 用意就是要真實的向外連線 , 以偵測連線是否正常. 提供參考囉 ! _= 沒事就 winsock 一下 =_
ORISBOY
一般會員


發表:11
回覆:7
積分:3
註冊:2004-10-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-25 18:37:50 IP:61.218.xxx.xxx 未訂閱
請問一下建立額外的 alive connection 是指建立另一個ClientSocket嗎, 利用這個ClientSocket來去check嗎,詳給的作法我是不太清楚,但是我的想法是利用timer來判斷當10秒內len=Socket->ReceiveLength()為0時,來中斷連線,其中這個len訂為全域變數,不知道你覺的這個想法是可行的嗎? 另外,我常在想我們電腦pc如果將網路拔掉,他會出現網路斷線的訊號,我在想我要如何利用ClientSocket來判斷。 我是ORIS,大家好
------
我是ORIS,大家好
microbean
初階會員


發表:1
回覆:43
積分:38
註冊:2004-04-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-25 19:16:31 IP:61.62.xxx.xxx 未訂閱
引言: 請問一下建立額外的 alive connection 是指建立另一個ClientSocket嗎, 利用這個ClientSocket來去check嗎,詳給的作法我是不太清楚,但是我的想法是利用timer來判斷當10秒內len=Socket->ReceiveLength()為0時,來中斷連線,其中這個len訂為全域變數,不知道你覺的這個想法是可行的嗎? 另外,我常在想我們電腦pc如果將網路拔掉,他會出現網路斷線的訊號,我在想我要如何利用ClientSocket來判斷。 我是ORIS,大家好
沒錯 , 就是另外建一個 connection , 這樣會有兩個 connection. 一個是用來傳送資料 , 另一個是偵測連線用的 connection. 用 Timer 判斷 ReceiveLength 是一個可行的方法 , 只要任何符合 Timeout 概念的想法都可以. 當網路線拔掉時 , 硬體會有狀態的變更 , 但不會告知 winsock , 所以 winsock 會不知道線路已經斷了 (因為斷線的狀態也是一個封包, 你實體線路斷了 , 會連這個斷線的封包都沒收到, 所以會不知斷線了) , 如果你要用 API 去看 Network Device 是否 online 應該也是有機會 , 但大部份的程式並不會這樣做, 我假設一種情形, 就是你的 Hub 某一條對外的網路線被拔了 , 結果你的網卡仍是正常 , 但你對外已經斷了 ...所以我們大多在連線技巧上琢磨 , 而不去偵測 Device 的狀態 . _= 沒事就 winsock 一下 =_
ORISBOY
一般會員


發表:11
回覆:7
積分:3
註冊:2004-10-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-26 10:27:16 IP:211.78.xxx.xxx 未訂閱
經由你的說明,我知道怎麼去決解我的問題了,感謝 我是ORIS,大家好
------
我是ORIS,大家好
microbean
初階會員


發表:1
回覆:43
積分:38
註冊:2004-04-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-26 14:52:49 IP:61.62.xxx.xxx 未訂閱
>不好意思,我還是有個地方不懂,因為我目前要寫一個程式透過網路的方式一>直在接收儀器所送出來的值,但是我用我的方法去check它的lenth時,發現這>個方法還是不太好,因為當網路線拔掉時,還是沒辨法去正確的判斷,請教一>下你說的再設一個clientsocket的方法是要怎麼做,如果方便的話可以教我一>下或是給我一個範例讓我參考一下,不好意思,我想了很多方法還是不行。 Hello , ORISBOY , 我想你的情形不適合用兩個 client socket 的方法 , 因為看起來你沒有做 server 的部分 , 這種方式我再舉一個例子, 假設 做一個 server , client 的連線程式 , client 一開始就建 兩個 connection 到 server , connection A , 負責傳資料 , connection B 負責檢查連線 ,假設 B 每隔 1 分鐘對 server 送一個 資料 , server 在設計時 , 收到這樣資料後, 同樣就回應一個資料給 client , 對 client 來說 , 如果丟資料給 server , 而 server 沒有 回應時 , 就代表連線有問題了 . 這種情形是你同時設計 client , 也同時設計 server 時用的. 所以你的情形 , 只能用 Timer 的方式做. 例如當 client 5 分鐘沒收到資料的時候認定為斷線 . _= 沒事就 winsock 一下 =_
LEO_HSU
一般會員


發表:2
回覆:5
積分:1
註冊:2005-05-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-27 10:01:11 IP:61.218.xxx.xxx 未訂閱
想請教microbean大大: 若是我想用API 得知Net Device的狀態該如何使用呢?
Ktop_Robot
站務副站長


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-04-26 13:50:39 IP:000.000.xxx.xxx 未訂閱
提問者您好:


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


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


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

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