全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1626
推到 Plurk!
推到 Facebook!

Indy : TIdTCPServerExecute ?

答題得分者是:microbean
Mummy
一般會員


發表:11
回覆:9
積分:4
註冊:2004-02-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-25 20:17:00 IP:61.220.xxx.xxx 未訂閱
TForm1::TIdTCPServerExecute { AThread->Connection->ReadBuffer(bBuf, size) } 我想利用 ReadBuffer( )讀接收資料, 可是有辦法知道, 有多少資料要接收嗎? size = ?
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-25 23:04:39 IP:61.221.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-26 09:26:04 IP:61.220.xxx.xxx 未訂閱
謝謝你, 我之前就是參考你的原始碼 但你用的是 ReadStream, Readlen等 我急需 (作測試硬體用), 只要有收到資料, 就將它讀到Buffer? 一直找不出方法,知道收到多少byte資料?
Mummy
一般會員


發表:11
回覆:9
積分:4
註冊:2004-02-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-26 11:51:38 IP:61.220.xxx.xxx 未訂閱
謝謝你, 我大概了解你的方法, 但我無法控制client送到server格式 有沒有方法得知server在呼叫TIdTCPServerExecute時, server自己收到多少byte資料嗎?
microbean
初階會員


發表:1
回覆:43
積分:38
註冊:2004-04-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-27 11:57:33 IP:210.58.xxx.xxx 未訂閱
可以先呼叫 ReadFromStack , 他可以知道有多少資料已讀進來. 知道 大小後 , 再用 readbuffer 去讀 . 不過,RaynorPao 兄的這種作法的概念是比較正確的. 因為在傳輸中 , 分為兩種方法去 判斷資料已經完整拿到. 1. 協定 Terminator , 例如 readln 的 #13#10 ... 2. 協定 傳輸的結構大小 , 也就是固定的大小 , 或是先傳 封包大小 , 再傳資料 如果都沒有以上的協定 , 對於後續程式的判斷 , 仍會 發生問題 , 因為你無法判斷 , 是否資料都拿齊了 , 除非 你將資料直接 drop 忽略處理 . 提供參考 _= 沒事就 winsock 一下 =_
Mummy
一般會員


發表:11
回覆:9
積分:4
註冊:2004-02-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-27 20:49:38 IP:61.220.xxx.xxx 未訂閱
如Server 用ReadStream, ReadLen, ReadBuffer... 因預期要收多少bytes資料, 如client發生少送了一些資料, 請問, 要如何處理?? 才能去讀已接收資料, 只乎視掉沒接收到資料 因我發現 ReadStream...好像會停住等要接收剩下還沒接收完資料?
microbean
初階會員


發表:1
回覆:43
積分:38
註冊:2004-04-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-27 23:21:38 IP:61.62.xxx.xxx 未訂閱
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
系統時間:2024-05-05 8:04:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!