兩台pc透過ClientSocket互傳資料時,如果有一台網路線拔掉,要如何判斷網路斷線 |
尚未結案
|
ORISBOY
一般會員 發表:11 回覆:7 積分:3 註冊:2004-10-25 發送簡訊給我 |
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
|
microbean
初階會員 發表:1 回覆:43 積分:38 註冊:2004-04-09 發送簡訊給我 |
網路的資料傳輸過程會存在很多變數 ,
通常除了 exception handle 外, 必需設計兩種概念 ,
1. Timeout :
不管連線是否斷掉 , 網路程式都應該去定義這件事情 ,
當資料沒有在預定的時間到達時 , 就應該去做例外處理. 2. 偵測連線 :
以你說的拔網路線的情形來說 , 大部份
是不會有 error 產生的,我們必須要在這兩個端點中間,
做固定時間的偵測 , 偵測的方法大概有兩種 , 1. 建立額外的 alive connection , 這個 connection 的用途
就是用來檢查雙方是否都alive , 雙方在固定的時間內 ,
送固定的檢查資料, 當任何一方發現對方沒有按照規定時 ,
就去做例外處理. 2. 固定時間去問特定的外部 server 是否有回應 , 例如用
HTTP 去抓某個網站的網頁 , 或是用 ICMP , 或是...等,
用意就是要真實的向外連線 , 以偵測連線是否正常. 提供參考囉 !
_= 沒事就 winsock 一下 =_
|
ORISBOY
一般會員 發表:11 回覆:7 積分:3 註冊:2004-10-25 發送簡訊給我 |
請問一下建立額外的 alive connection 是指建立另一個ClientSocket嗎,
利用這個ClientSocket來去check嗎,詳給的作法我是不太清楚,但是我的想法是利用timer來判斷當10秒內len=Socket->ReceiveLength()為0時,來中斷連線,其中這個len訂為全域變數,不知道你覺的這個想法是可行的嗎?
另外,我常在想我們電腦pc如果將網路拔掉,他會出現網路斷線的訊號,我在想我要如何利用ClientSocket來判斷。 我是ORIS,大家好
------
我是ORIS,大家好 |
microbean
初階會員 發表:1 回覆:43 積分:38 註冊:2004-04-09 發送簡訊給我 |
引言: 請問一下建立額外的 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 發送簡訊給我 |
|
microbean
初階會員 發表:1 回覆:43 積分:38 註冊:2004-04-09 發送簡訊給我 |
>不好意思,我還是有個地方不懂,因為我目前要寫一個程式透過網路的方式一>直在接收儀器所送出來的值,但是我用我的方法去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 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |