Indy : TIdTCPServerExecute ? |
答題得分者是:microbean
|
Mummy
一般會員 發表:11 回覆:9 積分:4 註冊:2004-02-20 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: TForm1::TIdTCPServerExecute { AThread->Connection->ReadBuffer(bBuf, size) } 我想利用 ReadBuffer( )讀接收資料, 可是有辦法知道, 有多少資料要接收嗎? size = ?Mummy 你好: 在這裡有範例 (包含原始碼) src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10003806&CC=223734"> -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
Mummy
一般會員 發表:11 回覆:9 積分:4 註冊:2004-02-20 發送簡訊給我 |
|
Mummy
一般會員 發表:11 回覆:9 積分:4 註冊:2004-02-20 發送簡訊給我 |
|
microbean
初階會員 發表:1 回覆:43 積分:38 註冊:2004-04-09 發送簡訊給我 |
可以先呼叫
ReadFromStack , 他可以知道有多少資料已讀進來.
知道 大小後 , 再用 readbuffer 去讀 .
不過,RaynorPao 兄的這種作法的概念是比較正確的.
因為在傳輸中 , 分為兩種方法去 判斷資料已經完整拿到. 1. 協定 Terminator , 例如 readln 的 #13#10 ...
2. 協定 傳輸的結構大小 , 也就是固定的大小 ,
或是先傳 封包大小 , 再傳資料 如果都沒有以上的協定 , 對於後續程式的判斷 , 仍會
發生問題 , 因為你無法判斷 , 是否資料都拿齊了 ,
除非 你將資料直接 drop 忽略處理 . 提供參考 _= 沒事就 winsock 一下 =_
|
Mummy
一般會員 發表:11 回覆:9 積分:4 註冊:2004-02-20 發送簡訊給我 |
|
microbean
初階會員 發表:1 回覆:43 積分:38 註冊:2004-04-09 發送簡訊給我 |
ReadStream 應該都會在你指定的資料長度收滿以後
才會回傳 , 除非 你用 AReadUntilDisconnect , 這也是一種方法.
這可以讓資料接收 , 一直收到斷線為止. 如果你沒有使用 AReadUntilDisconnect , client 少傳
或是漏傳, readstream 就會一直等下去. 在正常的 winsock 概念中 , 並不會有此種問題 ,
因為 我們通常都會 設定一個 buffer 作為接收資料使用
如果 buffer 沒有填滿 , 但是資料已經送達到一個階段
也可以如期的收到. 但 indy 在這個部分 , 就比較麻煩 如果要避免 server 一直在作 readstream 的 waitting .
可以設計一個通用的 timeout 機制 , 把連線過久的 socket
坎掉 , 這樣 , readstream 應該就會收到斷線之前的所有資料. 另一種想法 就是降低 readstream 的 size , 然後自行拼湊
最可憐的方法 就是用 readchar , 這用在網路很不穩定的狀況. _= 沒事就 winsock 一下 =_ 發表人 - microbean 於 2004/05/27 23:23:54
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |