用Non-blocking方式的TCP client 撰寫問題請教 |
答題得分者是:暗黑破壞神
|
merphy2000
一般會員 發表:2 回覆:9 積分:2 註冊:2005-01-10 發送簡訊給我 |
各位前輩:
我想由 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 發送簡訊給我 |
|
merphy2000
一般會員 發表:2 回覆:9 積分:2 註冊:2005-01-10 發送簡訊給我 |
|
merphy2000
一般會員 發表:2 回覆:9 積分:2 註冊:2005-01-10 發送簡訊給我 |
(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 發送簡訊給我 |
|
merphy2000
一般會員 發表:2 回覆:9 積分:2 註冊:2005-01-10 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言: 對不起, 可不可以請你講詳細點? 還是有其它前輩可以幫忙講解一下? 照著你的邏輯 再 想一遍我實在沒有得到我想知道的ㄋㄟ? 你講的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 發送簡訊給我 |
引言: 既然你 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 發送簡訊給我 |
|
merphy2000
一般會員 發表:2 回覆:9 積分:2 註冊:2005-01-10 發送簡訊給我 |
引言: 另外。你的壓力測試合格的標準又是怎樣?一秒會有多少個連線產生? 這些個數據沒出來。你到底在測什麼壓力???暗黑兄: 首先,你的回答一直讓我覺得你的口氣很衝! 我只是發個問題出來感覺好像被你在駡白痴,問什麼鳥問題! 我就是不懂,不會才問...會了我來這裡鬧的嗎? 你如果覺得我問的問題很沒水準你可以不回...但請不要污辱我! 我的server 是用TIdTCPServer元件做的...沒經特別處理...我不知道他最大限度可以在多短時間內開 thread來接客, 若你知道的話請跟我講. 我這篇的標題就是nonblock...你可以跟我講其它作法...但不是我要的...我還是會感激你! 我壓力測試沒什麼合格標準...就我自己測試而已..只是請大家思考我這樣測的結果為什麼會這樣? |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
引言: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 滿了。是會掉資料的。引言: 另外。你的壓力測試合格的標準又是怎樣?一秒會有多少個連線產生? 這些個數據沒出來。你到底在測什麼壓力???我的server 是用TIdTCPServer元件做的...沒經特別處理...我不知道他最大限度可以在多短時間內開 thread來接客, 若你知道的話請跟我講. 我這篇的標題就是nonblock...你可以跟我講其它作法...但不是我要的...我還是會感激你! 我壓力測試沒什麼合格標準...就我自己測試而已..只是請大家思考我這樣測的結果為什麼會這樣? |
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
引言: 各位前輩: 我想由 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |