ServerSocket 與 ClientSocket 傳送資料時, 發生資料遺失的問題 |
尚未結案
|
antonov_lin
一般會員 發表:5 回覆:11 積分:8 註冊:2005-08-23 發送簡訊給我 |
我最終的目的是想要實現簡單的遠端控制, 先試作畫面傳送;
我所使用的是 ServerSocket 與 ClientSocket; 在我自訂資料結構中, 訂定了
資料包序號(由0 起算), 總資料包數, 資料大小, 傳輸資料及 crc 碼共五項,
crc 碼計算序號, 總資料包數及傳輸資料三項;
理想的情況應該是由第0 包開始依序從 server 丟到 client, 並且每個資料
包在 client 接收後, 經計算序號, 總資料包數及傳輸資料, 必須要等於資料
包中的 crc 碼, 但是實際遇到的狀況是的確是由第0 包開始丟, 但是在中途
會出現資料包其序號不正常的現象, 所謂不正常是指序號會超出 0-總資料包數
, 而且有些資料包經計算後, 會發生不符合 crc 碼的現象, 實在是想不透到底
是為什麼, 不知有哪位先進可以指教.
我是在公司的網路環境下實作的.
以下是我的程式碼: ------ Server 端------
#include------ Client 端------ #include發表人 - antonov_lin 於 2005/12/06 19:58:00 |
antonov_lin
一般會員 發表:5 回覆:11 積分:8 註冊:2005-08-23 發送簡訊給我 |
|
antonov_lin
一般會員 發表:5 回覆:11 積分:8 註冊:2005-08-23 發送簡訊給我 |
|
antonov_lin
一般會員 發表:5 回覆:11 積分:8 註冊:2005-08-23 發送簡訊給我 |
|
cashyy
高階會員 發表:117 回覆:322 積分:212 註冊:2004-04-30 發送簡訊給我 |
|
antonov_lin
一般會員 發表:5 回覆:11 積分:8 註冊:2005-08-23 發送簡訊給我 |
cashyy 你好, 很感謝你回應來討論這個問題;
你所提到的, 我有想過, 這個問題其實有一個前提是在別篇討論中有提到的,
就是我目前使用 serversocket, clientsocket 的方式只能在區域網路中實作,
無法跨到別的區段, 所以我認為應該可以不必考慮網路頻寬的問題, 但是盡量
提昇傳輸效率仍是程式設計應該要考量的;
另外, 遠端傳輸應該區分為螢幕畫面和檔案兩個部分來看, 為何? 螢幕畫面
大小(bmp)幾乎可以說是固定, 而且螢幕畫面可以透過轉換為 jpeg 的格式並
加大jpeg 的壓縮率來達到縮小資料量的目的, 第二個方法就是在傳輸量的
限制下儘量加大資料包的大小, 來達到減少資料包數量的目的;
但若傳輸的是檔案, 大小就不定了, 只能靠第二個方法了;
我想, 不管是哪一種方法, 重點是資料要能正確地傳輸;
以上是我個人的淺見.
|
cashyy
高階會員 發表:117 回覆:322 積分:212 註冊:2004-04-30 發送簡訊給我 |
引言: cashyy 你好, 很感謝你回應來討論這個問題; 你所提到的, 我有想過, 這個問題其實有一個前提是在別篇討論中有提到的, 就是我目前使用 serversocket, clientsocket 的方式只能在區域網路中實作, 無法跨到別的區段, 所以我認為應該可以不必考慮網路頻寬的問題, 但是盡量 提昇傳輸效率仍是程式設計應該要考量的; 另外, 遠端傳輸應該區分為螢幕畫面和檔案兩個部分來看, 為何? 螢幕畫面 大小(bmp)幾乎可以說是固定, 而且螢幕畫面可以透過轉換為 jpeg 的格式並 加大jpeg 的壓縮率來達到縮小資料量的目的, 第二個方法就是在傳輸量的 限制下儘量加大資料包的大小, 來達到減少資料包數量的目的; 但若傳輸的是檔案, 大小就不定了, 只能靠第二個方法了; 我想, 不管是哪一種方法, 重點是資料要能正確地傳輸; 以上是我個人的淺見.您好! ServerSocket與ClientSocket在區網中loss的機會應該很低才對。所以在區網中應可以一直傳送封包,而不需要傳一次,確認一次! 關於第二個方法:雖然加大封包大小可以減少封包傳送的數量沒錯,但封包大小變大時,是不是更容易loss呢?? 如果您目前只是要在區網中傳送的話,我再把我的程式碼po上來一起討論。 真高興有人跟我一起討論這問題!謝謝啦! |
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
cashyy
高階會員 發表:117 回覆:322 積分:212 註冊:2004-04-30 發送簡訊給我 |
|
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
參考研究,網路延遲時間TSWaitTime
void __fastcall TFormMain1::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket) { ClientOK=true; if(language_mode==0)LabelConnectStatusN->Caption="網路連結成功!"; else LabelConnectStatusN->Caption="Network connect success!"; try { IdIcmpClient1->Host=CLIENT1; IdIcmpClient1->Ping(); TSWaitTime=IdIcmpClient1->ReplyStatus.MsRoundTripTime; if(TSWaitTime<=5)TSWaitTime=5; } catch(...) { TSWaitTime=50; } } |
cashyy
高階會員 發表:117 回覆:322 積分:212 註冊:2004-04-30 發送簡訊給我 |
|
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
網路連結成功後,透過Indy元件IdIcmpClient1之Ping功能,回傳ReplyStatus.取出網路延遲時間,加入Sendbuf迴路中如下.
if(ClientOK) { FormMain1->ClientSocket1->Socket->SendBuf(temp, 2002); ::Sleep(TSWaitTime); }當時測試,若於內部網路是不需延遲.影像傳送非常即時漂亮.但透過internet卻出現許多錯誤,加延遲後錯誤率降低,但影像傳輸就有延遲現象,抓不到適當延遲時間,突發奇想將Ping的網路延遲時間加入Sendbuf迴路中,這樣子不管內部或外部網路皆適用,影像傳送從此就不再出現亂掉情況. |
antonov_lin
一般會員 發表:5 回覆:11 積分:8 註冊:2005-08-23 發送簡訊給我 |
cashyy and DavidLo 兩位你好,
我目前是在公司內部區網實作, 實際上也發現, 如果資料量很小 (例如只有幾
個byte), 的確是沒有 loss 的問題, 但是對於螢幕畫面來說, 資料量並不小,
勢必要分解成幾個資料包, 若分成小資料包, 資料包數量就會很多, 我猜想就
會有比較大的機率出錯, 所以我才選擇減少資料包數量的方式去做; 另外, 請
教一下如果要能跨出區網, 那又該怎麼做呢 ? 能否指教.
Indy 元件用起來沒有問題嗎 ? 那為什麼又會有更新版本出現嗎 ? 看過站上
有不少討論及文章是用 Indy 元件來實作的, 真是讓我很想要用又有點不敢用.
|
cashyy
高階會員 發表:117 回覆:322 積分:212 註冊:2004-04-30 發送簡訊給我 |
引言: cashyy and DavidLo 兩位你好, 我目前是在公司內部區網實作, 實際上也發現, 如果資料量很小 (例如只有幾 個byte), 的確是沒有 loss 的問題, 但是對於螢幕畫面來說, 資料量並不小, 勢必要分解成幾個資料包, 若分成小資料包, 資料包數量就會很多, 我猜想就 會有比較大的機率出錯, 所以我才選擇減少資料包數量的方式去做; 另外, 請 教一下如果要能跨出區網, 那又該怎麼做呢 ? 能否指教. Indy 元件用起來沒有問題嗎 ? 那為什麼又會有更新版本出現嗎 ? 看過站上 有不少討論及文章是用 Indy 元件來實作的, 真是讓我很想要用又有點不敢用.您好! 個人覺得將封包大小變大會比較容易loss,因為在internet傳輸時,可能傳到一半,後面另一半的資料就loss了!我目前是用1k來測試啦! 請留您的mail,寄給您我目前的程式! |
antonov_lin
一般會員 發表:5 回覆:11 積分:8 註冊:2005-08-23 發送簡訊給我 |
|
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
cashyy
高階會員 發表:117 回覆:322 積分:212 註冊:2004-04-30 發送簡訊給我 |
引言: cashyy, 你好, 我的郵件位址是 nexee_lin@wistron.com.tw 請問, 你的程式可以跨過區域網路嗎 ?您好! 已寄給您了!不過我把(重送封包機制、收到loss封包處理的功能拿掉了),因為寫的太亂,怕您看不懂,如果您需要的話,我可以再放上來讓您參考!說參考好像不對喔!應該說討論啦! 我的程式可以跨區網,可是封包還會loss,要等到期末考完,才會試DavidLo大大的"網路延遲時間",所以目前還沒加上偵測網路延遲時間的功能。 (這是個人測試的程式啦,寫的不好,請大大多指導)。 再次感謝DavidLo大大提供程式碼!謝謝 發表人 - cashyy 於 2005/12/13 00:00:09 |
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |