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

用Non-blocking方式的TCP client 撰寫問題請教

答題得分者是:暗黑破壞神
merphy2000
一般會員


發表:2
回覆:9
積分:2
註冊:2005-01-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-25 16:48:14 IP:61.220.xxx.xxx 未訂閱
各位前輩: 我想由 TCP client 送一message到 TCP server, 當 server收到後回覆另一message給client,然後關掉該client的連線。 我 client用 Tclientsocket元件採 ctNonblocking方式 Server用 TIdTCPServer元件(Threading) 我在 client端設了一個 timer每 50 ms會做一次. 我發現當 timer 執行了1000次後,client只成功送出約987筆,當timer的interval設得愈小時, loss率愈大... 請問client用ctNonblocking方式時,有辦法避免這種loss 嗎? -------謝謝你耐心看完。
暗黑破壞神
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-25 18:07:57 IP:221.169.xxx.xxx 未訂閱
@.@ 你都沒算一下你 connect 的時間要幾 ms 喔。 你由 client 發出要連線的動作之後。 client -> server server -> client 這樣要多少封包才能建立連線。 你在建立後就立刻斷線? 你是在做轟炸動作嗎? 50ms 就做一次連線? 你應該要努力的去讀一下 TCP/IP 然後再來談你做這個動作為何會 lose 吧。 ^_^
merphy2000
一般會員


發表:2
回覆:9
積分:2
註冊:2005-01-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-25 19:23:13 IP:61.220.xxx.xxx 未訂閱
發表人 - merphy2000 於 2005/04/25 19:32:58
merphy2000
一般會員


發表:2
回覆:9
積分:2
註冊:2005-01-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-25 19:28:26 IP:61.220.xxx.xxx 未訂閱
(1)剛測了一下由 client -> server -> client的單次時間 < 50ms, 不過每次時間都不固定,做愈多次結果好像時間是 10ms 或 20ms出現次數較多. (2)我程式的作法是在 server回覆封包後的下一行做斷線動作. eq: AThread->Connectoin->WriteBuffer(Message,1024,true); Athread->Connection->Disconnect(); (3)因為不是很了解non-blocking實際上的運作程序,我想知道: 1. 像上面我Server在write完後立刻Disconnect會不會有問題? 2. 在極短時間下,client 又要去連線時會怎樣? 它的連線要求會被bypass嗎?還是會有其它錯誤產生? ------謝謝回覆!
暗黑破壞神
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-25 20:43:58 IP:221.169.xxx.xxx 未訂閱
1.你先想想你的電腦在接到連線要求時做那些事。 2.你再來想想你這樣就斷線的意義在那裏? 3.你再去看看它help中怎麼寫 noblock 的動作。 是不是要配合 multi thread 的方式來操作。 4.你再去了解什麼是 multi thread 5.當你了解了以上這些之後。你的問題就解開了。 不然,我說再多。你還是不清楚。 因為。。。。問題太大了。^_^
merphy2000
一般會員


發表:2
回覆:9
積分:2
註冊:2005-01-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-25 22:44:29 IP:220.136.xxx.xxx 未訂閱
引言: 1.你先想想你的電腦在接到連線要求時做那些事。 2.你再來想想你這樣就斷線的意義在那裏? 3.你再去看看它help中怎麼寫 noblock 的動作。 是不是要配合 multi thread 的方式來操作。 4.你再去了解什麼是 multi thread 5.當你了解了以上這些之後。你的問題就解開了。 不然,我說再多。你還是不清楚。 因為。。。。問題太大了。^_^
對不起, 可不可以請你講詳細點? 還是有其它前輩可以幫忙講解一下? 照著你的邏輯 想一遍我實在沒有得到我想知道的ㄋㄟ? 你講的1~4點我應該有點認識,但懂得可能不夠。可否麻煩你把你認為該要了解的地方講明白點。(我Write完斷線因為client不需要再連著也不希望他再連著,之前是用udp做,但我想試試tcp的作法) 我想,用blocking的方式應該不會有這個問題,但現在用non-blocking的方式是不是會遇到我這樣的結果? 謝謝!
暗黑破壞神
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-26 00:03:08 IP:221.169.xxx.xxx 未訂閱
引言: 對不起, 可不可以請你講詳細點? 還是有其它前輩可以幫忙講解一下? 照著你的邏輯 想一遍我實在沒有得到我想知道的ㄋㄟ? 你講的1~4點我應該有點認識,但懂得可能不夠。可否麻煩你把你認為該要了解的地方講明白點。(我Write完斷線因為client不需要再連著也不希望他再連著,之前是用udp做,但我想試試tcp的作法) 我想,用blocking的方式應該不會有這個問題,但現在用non-blocking的方式是不是會遇到我這樣的結果?
既然你 write 完斷線的原因是 client 不需要再連著,也不希望它再連著。 為何你又要 client 在 50ms 就要”再”連線一次呢? 所以我搞不懂你到底在幹什麼? 至於你要用 non-blocking 的時候。既然你懂得 multi thread 是怎麼一回事。 那你就可以評估一下。當連線要求進來時。你是不是夠時間再開 thread 來接客啊。 你的需求極不正規。你不說出你這樣做的原因,我不會再跟你談要怎麼做了。 因為談也沒用。你會有你的堅持。 就這樣。
merphy2000
一般會員


發表:2
回覆:9
積分:2
註冊:2005-01-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-26 09:57:24 IP:61.220.xxx.xxx 未訂閱
引言: 既然你 write 完斷線的原因是 client 不需要再連著,也不希望它再連著。 為何你又要 client 在 50ms 就要”再”連線一次呢? 所以我搞不懂你到底在幹什麼? 至於你要用 non-blocking 的時候。既然你懂得 multi thread 是怎麼一回事。 那你就可以評估一下。當連線要求進來時。你是不是夠時間再開 thread 來接客啊。 你的需求極不正規。你不說出你這樣做的原因,我不會再跟你談要怎麼做了。 因為談也沒用。你會有你的堅持。 就這樣。
很抱歉我沒有把我的目的說清楚, 因為我的server要提供給很多client來連線, 而client連到server就只是查詢一個message... 每個client連進來server可能會很頻繁... 基本上同一個client在很短時間又連進來的機率應該很低 不過我想做壓力測試...... 所以設了一個 timer在做, 做到這我發現了一些問題, 因此提出來請大家幫忙思考這個現象,如有經驗的或知道的前輩也請不吝分享: 當timer設的時間太短時會怎樣? (可能連線要求才丟出去尚未建立連線或已建立連線尚未傳資料出去...,若這時timer又啟動了...)這時會出錯? 會被bypass ?這樣的現象是non-blocking方式做的正常現象嗎?用 non-blocking做有其它方式可以避免這種現象? ----非常謝謝您寶貴的意見,也請不要說談了也沒用這樣的話... ----您每句正面回覆的話都可能縮短我找到解答所花的時間. 非常謝謝!
暗黑破壞神
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-26 10:09:43 IP:221.169.xxx.xxx 未訂閱
我在上一封回你了。
引言: 那你就可以評估一下。當連線要求進來時。你是不是夠時間再開 thread 來接客啊。
你先回答這個問題。你再來看什麼叫 nonblock 吧。 你先別把焦點放在 nonblock 可以嗎? 另外。你的壓力測試合格的標準又是怎樣?一秒會有多少個連線產生? 這些個數據沒出來。你到底在測什麼壓力???
merphy2000
一般會員


發表:2
回覆:9
積分:2
註冊:2005-01-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-26 10:53:48 IP:61.220.xxx.xxx 未訂閱
引言: 另外。你的壓力測試合格的標準又是怎樣?一秒會有多少個連線產生? 這些個數據沒出來。你到底在測什麼壓力???
暗黑兄: 首先,你的回答一直讓我覺得你的口氣很衝! 我只是發個問題出來感覺好像被你在駡白痴,問什麼鳥問題! 我就是不懂,不會才問...會了我來這裡鬧的嗎? 你如果覺得我問的問題很沒水準你可以不回...但請不要污辱我! 我的server 是用TIdTCPServer元件做的...沒經特別處理...我不知道他最大限度可以在多短時間內開 thread來接客, 若你知道的話請跟我講. 我這篇的標題就是nonblock...你可以跟我講其它作法...但不是我要的...我還是會感激你! 我壓力測試沒什麼合格標準...就我自己測試而已..只是請大家思考我這樣測的結果為什麼會這樣?
暗黑破壞神
版主


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-04-26 11:42:55 IP:221.169.xxx.xxx 未訂閱
引言:
引言: 另外。你的壓力測試合格的標準又是怎樣?一秒會有多少個連線產生? 這些個數據沒出來。你到底在測什麼壓力???
我的server 是用TIdTCPServer元件做的...沒經特別處理...我不知道他最大限度可以在多短時間內開 thread來接客, 若你知道的話請跟我講. 我這篇的標題就是nonblock...你可以跟我講其它作法...但不是我要的...我還是會感激你! 我壓力測試沒什麼合格標準...就我自己測試而已..只是請大家思考我這樣測的結果為什麼會這樣?
1.開 thread 不是 TIdTCPServer 開的。我回的第二篇已經跟你說了。 你要去了解什麼是 multi thread. 你回答我是你已經知道了。 但是由這裏我知道,你的觀念並不清楚。能不能麻煩你,自己去看看 windows 的 multi thread 的運作是怎麼做的? 2.nonblock 本來就跟你的 multi thread 也就是說你的作業系統的處理有關。 你在觀念上要分開看。你在處理這種的瓶頸時,要合在一起評估。 3.你的 connect lost 的問題。我在第一篇答覆也說了。你要去看看 TCP/IP 。 我想。你也不清楚它的真實運作。所以才會有這樣的問題。 不要講底層。講上面一點的,在我開了一個 socket 時。 要進入 listen 狀態。等待 client 的連線時。我要有一個動作去設定,我這個 socket 要有多大的 buffer 來做 client 已連線。但是 ap 還沒空來處理這一個連線的時候。先把這個放著。等 ap 有空再來處理。而如果還有太多沒法子塞進 buffer 那就是 無法連線。 這是 TCP/IP 的運作。 當你用了別人包好的元件時。請詳細的去讀它的使用手冊。或是原始媽。 看看人家的元件是怎麼”實作”這些原理的。 然後你才能用這些元件。 才不會有你所問的這些個問題。 因為你的觀念沒有搞清楚。而去用那些人家包好的元件。 就會產生不知道怎麼避開問題的狀況。 講簡單一點就是基礎不穩啦。可是你又已經把大樓蓋起來了。 如果只是 只是請大家思考我這樣測的結果為什麼會這樣? 那你去想想 RS232 的 FIFO 這個東東。 跟你現在的問題。是一樣的。 當 FIFO 滿了。是會掉資料的。
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-04-26 14:28:57 IP:221.169.xxx.xxx 未訂閱
引言: 各位前輩: 我想由 TCP client 送一message到 TCP server, 當 server收到後回覆另一message給client,然後關掉該client的連線。 我 client用 Tclientsocket元件採 ctNonblocking方式 Server用 TIdTCPServer元件(Threading) 我在 client端設了一個 timer每 50 ms會做一次. 我發現當 timer 執行了1000次後,client只成功送出約987筆,當timer的interval設得愈小時, loss率愈大... 請問client用ctNonblocking方式時,有辦法避免這種loss 嗎?
所謂 Nonblocking 簡單說,就是當你下達 SendBuffer or WriteBuffer 時,基本上會立即返回,而不是等資料送完之後才返回,可是此時資料可能還沒有傳送完畢喔,而此時你又立即下達 Disconnect ,那當然會LOST資料 你可能會說:『偶只有10% 或更少的資料才會LOST』,道理粉簡單,那就是你要送出去的資料太少,少到可以立即送出,所以不會LOST,但是當你送出大量資料(例如:同一時間有100以上CLIENT,連上線時),就有可能發生,這剛好解釋為什麼你傳送的間隔越頻繁,資料就越容易LOST。你只是犯了一個小小的錯誤 ^^ 偶提一個方式,你測一下,『應該』可以把LOST比率拉高, 1.CLIENT 連到 SERVER 是用『慢速』的網路連接(如撥接或其他方式) 2.網路上有大量的封包在傳送(例如:有N台以上的PC,透過網路彼此COPY對方的資料,如:A抓B、B抓C、C抓A...等等) 透過以上任一種方式,你程式中的漏洞,應該就可以粉清楚資料了。方式1最明顯 至於解決的方式.....偶提幾種 1. 當下達 SendBuffer or WriteBuffer 之後,等待一段時間之後再斷線(不能用SLEEP喔,如果SLEEP,你要叫誰幫你送資料) 優點:粉簡單寫 缺點:等待的時間,不好估計,太高、太低都不好 2. 當你送資料給對方時,對方收到後再送一個一個訊息回來,確認收到之後再斷線 優點:保證安全,使命必達 (快遞公司.... ^^) 缺點:若對方沒送回應回來,會造成該THREAD一直在等待(可以等待一段時間之後即斷線) 不好寫~~煩 >"< 整個處理時間會被拉長 3.對方收到資料後,由對方主動斷線 優點:保證安全,使命必達,上面兩種方法的集合版 (還是快遞公司.. ^^) 缺點:若對方沒送回應回來,會造成該THREAD一直在等待(可以等待一段時 間之後即斷線) 偶個人建議用方法3 但是你必須考慮例外狀況,亦即房只有CLIENT連上線之後不做事,或只做一半...等等 最後偶看了一下, merphy2000 你也不用生氣,暗黑只是希望你能回過頭,把基礎打穩,如TCP/IP,MULTI THREAD等等,而這兩部分,可以各自寫成一本書,而且是那種厚到可以砸屬人的書,這也是沒人會『正面』回答你問題的原因,因為實在不知從何講起,想像一下,你能對小學生講解一元一次方程式嗎? 還有~~上面所說的,只是最基本的,偶猜你這隻程式才剛剛開始寫,偶只能說MULTI THREAD......沒有你想像的簡單喔,建議你最少、最少你要先把MULTI THREAD相關的東西看完再來寫程式,這樣會比較好喔(這是偶個人『慘痛』的經驗...>"<),不然你會連程式怎麼當掉都不知道 兩位都別生氣~~~ ========================= <>大家一起快樂寫程式 發表人 -
merphy2000
一般會員


發表:2
回覆:9
積分:2
註冊:2005-01-10

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-04-26 15:10:15 IP:61.220.xxx.xxx 未訂閱
呼~ 很感謝兩位寫了那麼多來啟蒙我, 讓我真是收獲良多!! 我這方面是半途出家...可以說是一點基礎也沒有...很多不懂! 問的問題可能也不是很恰當...但總是要問...... 請多海函... 再次謝謝兩位耐心的回答!
系統時間:2024-04-29 18:57:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!