关于TIdTCPServer接收数据的疑问 |
尚未結案
|
fangwy
中階會員 發表:99 回覆:139 積分:62 註冊:2003-09-10 發送簡訊給我 |
在使用TIdTCPServer,我用下面的语句读收到的数据:
TIdPeerThread(List.Items[List.Count - 1]).Connection.ReadBuffer(buffResult, ResultLength);
但发现ReadBuffer只有读满ResultLength指定长度的数据才返回,否则就阻塞住不返回.我试图找到获取读缓冲区数据长度的方法,但TIdTCPServer好象没提供.
我又采取设置超时的方法去循环读写,但问题又来了,因ReadBuffer没有返回实际读的长度,无法确定是否读到数据及读了多少,而且超时返回就引发异常,终止执行,不好控制.
哪位大大熟悉TIdTCPServer,给我一个解决的方法,谢谢.
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
|
fangwy
中階會員 發表:99 回覆:139 積分:62 註冊:2003-09-10 發送簡訊給我 |
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
|
fangwy
中階會員 發表:99 回覆:139 積分:62 註冊:2003-09-10 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
http://delphi.ktop.com.tw/topic.php?topic_id=66366 找到這篇最後一段程式碼可以參考一下
|
fangwy
中階會員 發表:99 回覆:139 積分:62 註冊:2003-09-10 發送簡訊給我 |
引言: 這樣試試看 iLen:=IdTcpConnect.ReadFromStack(false, 20, false); if iLen>0 then IdTcpConnect.ReadBuffer(Buffer,iLen); ReadFromStack 會從 Socket 的 Buffer 中搬資料到 Indy 內建的 Buffer, 並傳回搬了多少長度的資料過去, 再由 ReadBuffer 將其讀回就可以了.有一个问题,难道数据没有自动被搬到Indy内建的Buffer中吗? |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
由原始碼來看, 是沒有自動搬
而是用ㄧ個無限迴圈 等到讀到足夠資料....
Indy 是 open source 好處就是有疑問可以自己找出根源... IdTCPConnection.pas
procedure TIdTCPConnection.ReadBuffer(var ABuffer; const AByteCount: Integer); begin if (AByteCount > 0) and (@ABuffer <> nil) then begin // Read from stack until we have enough data while (InputBuffer.Size < AByteCount) do begin ReadFromStack; CheckForDisconnect(True, True); end; // Copy it to the callers buffer Move(InputBuffer.Memory^, ABuffer, AByteCount); // Remove used data from buffer InputBuffer.Remove(AByteCount); end; end; |
fangwy
中階會員 發表:99 回覆:139 積分:62 註冊:2003-09-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |