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

請教關于使用IndyTCP控件傳送Stream數據的問題

尚未結案
flowermarsh
一般會員


發表:8
回覆:9
積分:8
註冊:2007-05-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-26 11:47:44 IP:202.108.xxx.xxx 訂閱
據我所知使用TCP/IP方式傳送數據,當傳送的數據大于8K字節時,會自動分包傳送。所以當stream數據很大時,會發送多個包。
比方説client端給server端發送一個size比較大的stream時,server端會否多次觸發Execute事件過程?
而如果server端給client端發送一個size比較大的stream時,是否client要多次使用readstream方法接收數據呢?
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-26 12:52:17 IP:211.22.xxx.xxx 未訂閱
要保障你的數據傳輸一定要以TCP的通信協定方式來傳送,Size多大在Application層而言則建議以WORD的倍數緩衝區大小來傳送,這牽扯到Word Alignment效能的問題,至於是否會將資料包在切割成多少封包,這是屬於底層IP協定,你的應用程式管不到!除非你直接以最底層的WINSOCK API去寫,另外不管切成多少個TCP都將保障各個封包的會正確到達彼方。
因此在寫資料傳送時,最好也要自訂上層的協定,傳送方每送出一次資料之前也要告訴接收方,我這次送出多少資料,並且作一下資料驗證,而接收方在收完資料之後,要確認收到的資料大小與資料內容是否正確。
===================引 用 flowermarsh 文 章===================
據我所知使用TCP/IP方式傳送數據,當傳送的數據大于8K字節時,會自動分包傳送。所以當stream數據很大時,會發送多個包。
比方説client端給server端發送一個size比較大的stream時,server端會否多次觸發Execute事件過程?
而如果server端給client端發送一個size比較大的stream時,是否client要多次使用readstream方法接收數據呢?
flowermarsh
一般會員


發表:8
回覆:9
積分:8
註冊:2007-05-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-26 13:51:04 IP:202.108.xxx.xxx 訂閱
感謝解答。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-26 22:03:17 IP:59.40.xxx.xxx 訂閱
Indy 已经把 TCP 封装了。如果使用 Indy 的话,你发送 Stream 有2种办法。你可以仔细看看 dTCPClient1.ReadStream(....) 里的参数的名称,那些名称已经提示你了。

简单点说,就是你可以告诉 Indy 你读这个 Stream 要读多大。Indy 是阻塞读,如果没读够你设置的大小,就会阻塞在这里,一直等到读够指定大小后,才继续向下执行。

ReadStream 要和 WriteStream(.....) 里的参数对照用。ReadStream 里面的参数可以指定这个 Stream 有指定大小,也就是说在这种情况下,Indy 会为发送的数据在前面加上长度,ReadStream 就会自动地在读完正确的长度后继续向下执行。

具体的,你可以参考 Indy 的官方 Demo 里关于 Stream 的例子。或者,看这里:http://groups.google.com/group/ITInfor/browse_thread/thread/7bf62b52c1e08b3a
系統時間:2024-04-24 18:09:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!